精华内容
下载资源
问答
  • Oracle数据库客户端有一个...为了提高dump文件的写入效率,我们尝试使用sqlplus命令来生成dump文件。 sqlplus可以指定运行脚本,例如: sqlplus admin/pwd@//127.0.0.1:1526/orcl@./tmp_sql/NODE_dump_sql_201...

            Oracle数据库客户端有一个sqlplus组件,这个组件能够让我们通过命令行的方式执行一些数据库操作。为了提高dump文件的写入效率,我们尝试使用sqlplus命令来生成dump文件。

            sqlplus可以指定运行脚本,例如:

    sqlplus admin/pwd@//127.0.0.1:1526/orcl@./tmp_sql/NODE_dump_sql_20180516130228316.sql

            我们在这个脚本里面可以通过spool命令打开一个文件,然后将sql查询出来的结果写入这个文件。

            具体代码如下:

    package com.code.dump;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    public class DumpFile2 {
    	/** 数据库连接参数 */
    	static final String DB_HOST = "127.0.0.1:1526";
    	static final String DB_SID = "oracl";
    	static final String DB_USER = "admin";
    	static final String DB_PWD = "pwd";
    	static final String TABLE_NAME = "NODE";
    	/** 拼接的sql每行字符数,超过ROW_CHAR_COUNT就换行,防止sql过长 */
    	static final int ROW_CHAR_COUNT = 1000;
    	/** dump文件保存路径 */
    	static final String DUMP_FILE_PATH = "./dump_file";
    	/** sqlPlus执行脚本存放路径 */
    	static final String SQL_PLUS_FILE_PATH = "./tmp_sql";
    	static Connection connection = null;
    
    	public static void main(String[] args) {
    		try {
    			long start = System.currentTimeMillis();
    			String sql = generateInsertSql();
    			generateDumpFileBySqlPlus(sql);
    			System.out.println("---------------------------\n"+"all cost time is " + (System.currentTimeMillis() - start) + " ms"+"\n-----------------------------\n");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (connection != null) {
    				try {
    					connection.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	/** 生成使用的sql语句 */
    	static String generateInsertSql() throws Exception {
    		// 存储需要备份的表的列的信息(column_name,data_type)
    		List<ColumnInfo> cols = new ArrayList<ColumnInfo>();
    		// 创建oracle数据库连接
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		connection = DriverManager.getConnection("jdbc:oracle:thin:@" + DB_HOST + ":" + DB_SID, DB_USER, DB_PWD);
    		Statement sql = connection.createStatement();
    
    		// 查询需备份表的所有列信息
    		ResultSet columns = sql.executeQuery("select column_name, data_type from user_tab_columns where table_name='" + TABLE_NAME.toUpperCase() + "'");
    		while (columns.next()) {
    			ColumnInfo columnInfo = new ColumnInfo(columns.getString(1), columns.getString(2));
    			cols.add(columnInfo);
    		}
    
    		// 拼接insert的前半部分
    		// eg:insert into charge_value_lookup(RESULT_ID,TAX_IDS,FEE_IDS) values(
    		StringBuffer insertSql = new StringBuffer("insert into " + TABLE_NAME + "(");
    		int index = 1;
    		for (ColumnInfo col : cols) {
    			if (insertSql.length() > ROW_CHAR_COUNT * index) {
    				insertSql.append("\n");
    				index++;
    			}
    			insertSql.append(col.getColumnName()).append(",");
    		}
    		insertSql.delete(insertSql.length() - 1, insertSql.length());
    		insertSql.append(") values(");
    		System.out.println("---------------------------\n"+insertSql.toString()+"\n-----------------------------\n");
    
    		// 拼接sql调用的查询语句
    		// eg:select 'insert into charge_value_lookup(RESULT_ID,TAX_IDS,FEE_IDS) values(' ||''''||RESULT_ID||''''||','||''''||TAX_IDS||''''||','||''''||FEE_IDS||''''||');' from charge_value_lookup
    		StringBuffer excSql = new StringBuffer("select '").append(insertSql).append("' ");
    		index = 1;
    		for (int i = 0; i < cols.size(); i++) {
    			if (excSql.length() > ROW_CHAR_COUNT * index) {
    				excSql.append("\n");
    				index++;
    			}
    			ColumnInfo columnInfo = cols.get(i);
    			switch (columnInfo.getDataType()) {
    			case "CHAR":
    			case "VARCHAR2":
    				excSql.append("||").append("''''").append("||").append(columnInfo.getColumnName()).append("||").append("''''");
    				break;
    			case "NUMBER":
    			case "FLOAT":
    			case "LONG":
    				excSql.append("||").append("nvl(to_char(" + columnInfo.getColumnName() + ")," + columnInfo.getColumnName() + "||'null')");
    				break;
    			case "DATE":
    				break;
    			default:
    				throw new Exception("表的列类型不支持");
    			}
    			if (i != cols.size() - 1) {
    				excSql.append("||").append("','");
    			} else {
    				excSql.append("||');'");
    			}
    		}
    		excSql.append(" from " + TABLE_NAME + "");
    
    		System.out.println("---------------------------\n"+excSql.toString()+"\n-----------------------------\n");
    
    
    		return excSql.toString();
    	}
    
    	/** 通过sqlPlus操作生成dump文件 */
    	private static void generateDumpFileBySqlPlus(String sql) throws Exception {
    		// 创建文件存储目录
    		File directory = new File(DUMP_FILE_PATH);
    		if (!directory.exists()) {
    			directory.mkdirs();
    		}
    		directory = new File(SQL_PLUS_FILE_PATH);
    		if (!directory.exists()) {
    			directory.mkdirs();
    		}
    		// sqlPlus调用的sql脚本
    		String genSqlPlusFilePath = SQL_PLUS_FILE_PATH + "/" + TABLE_NAME + "_dump_sql_" + getTimeStamp() + ".sql";
    		if (!Files.exists(Paths.get(genSqlPlusFilePath))) {
    			Files.createFile(Paths.get(genSqlPlusFilePath));
    		}
    		// 生成的dump文件
    		String dumpFilePath = DUMP_FILE_PATH + "/" + TABLE_NAME + "_dump_" + getTimeStamp() + ".dump";
    		if (!Files.exists(Paths.get(dumpFilePath))) {
    			Files.createFile(Paths.get(dumpFilePath));
    		}
    
    		// sqlPlus 命令头
    		final String[] headers = new String[] { "set echo off;", "set feedback off;", "set term off;", "set heading off;", "set sqlblanklines off;",
    				"set linesize 5000;", "spool " + dumpFilePath + ";" };
    
    		final String[] tails = new String[] { "spool off;", "exit;" };
    
    		// 创建sqlplus可执行的sql文件
    		FileChannel fileChannel = FileChannel.open(Paths.get(genSqlPlusFilePath), StandardOpenOption.READ, StandardOpenOption.WRITE);
    		for (String header : headers) {
    			fileChannel.write(ByteBuffer.wrap((header + "\n").getBytes()));
    		}
    		fileChannel.write(ByteBuffer.wrap((sql + ";\n").getBytes()));
    		for (String tail : tails) {
    			fileChannel.write(ByteBuffer.wrap((tail + "\n").getBytes()));
    		}
    		fileChannel.close();
    
    		String sqlPlusCmd = "sqlplus " + DB_USER + "/" + DB_PWD + "@//" + DB_HOST + "/" + DB_SID + " @" + genSqlPlusFilePath;
    		System.out.println(sqlPlusCmd);
    		Process process = Runtime.getRuntime().exec(sqlPlusCmd);
    		process.waitFor();
    		InputStream is = process.getInputStream();
    		printCmdOutMsg(is);
    		
    	}
    
    	static String getTimeStamp() {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    		return sdf.format(new Date());
    	}
    	
    	static void printCmdOutMsg(InputStream is) throws IOException {
    		System.out.println("----------------start----------------------");
    		BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("gbk")));
    		String out = reader.readLine();
    		while (out != null) {
    			System.out.println(out);
    			out = reader.readLine();
    		}
    		System.out.println("----------------end----------------------");
    	}
    
    }

            程序的输出结果:

    ---------------------------
    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values(
    -----------------------------
    
    ---------------------------
    select 'insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values(' ||''''||TENANT_ID||''''||','||nvl(to_char(NODE_ID),NODE_ID||'null')||','||nvl(to_char(PARENT_NODE_ID),PARENT_NODE_ID||'null')||','||''''||NAME||''''||','||nvl(to_char(NODE_TYPE_ID),NODE_TYPE_ID||'null')||','||nvl(to_char(HIERARCHY_TYPE_ID),HIERARCHY_TYPE_ID||'null')||','||''''||ACCOUNT_ID||''''||','||nvl(to_char(SHORTCUT_NODE_ID),SHORTCUT_NODE_ID||'null')||','||''''||SHORTCUT||''''||','||nvl(to_char(CHECK_ID),CHECK_ID||'null')||','||nvl(to_char(CHECK_STATUS),CHECK_STATUS||'null')||','||nvl(to_char(SCHEDULE_ID),SCHEDULE_ID||'null')||','||''''||CHECKED_BY||''''||','||''''||CHECKED_DATE||''''||','||''''||ADDED_BY||''''||','||''''||ADDED_DATE||''''||','||''''||UPDATED_BY||''''||','||''''||UPDATED_DATE||''''||','||''''||NAME_1||''''||','
    ||''''||NAME_2||''''||','||''''||NAME_3||''''||');' from NODE
    -----------------------------
    
    sqlplus admin/pwd@//127.0.0.1:1526/orcl@./tmp_sql/NODE_dump_sql_20180516130228316.sql
    ----------------start----------------------
    
    SQL*Plus: Release 11.2.0.1.0 Production on 星期三 5月 16 13:02:32 2018
    
    Copyright (c) 1982, 2010, Oracle.  All rights reserved.
    
    
    连接到: 
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options
    
    从 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Testing options 断开
    ----------------end----------------------
    ---------------------------
    all cost time is 57403 ms
    -----------------------------
    
    

            dump文件内容跟Java项目生成Oracle数据库dump文件(一)里面的dump文件一样。

            在这个实现方法里面,我们首先也是拼出里select  'insert into...'语句,然后我们将这个sql语句和一些sqlplus的命令头写入了tmp_sql下面的一个临时文件,这个文件的内容如下:

    set echo off;
    set feedback off;
    set term off;
    set heading off;
    set sqlblanklines off;
    set linesize 5000;
    spool ./dump_file/NODE_dump_20180516130228320.dump;
    select 'insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values(' ||''''||TENANT_ID||''''||','||nvl(to_char(NODE_ID),NODE_ID||'null')||','||nvl(to_char(PARENT_NODE_ID),PARENT_NODE_ID||'null')||','||''''||NAME||''''||','||nvl(to_char(NODE_TYPE_ID),NODE_TYPE_ID||'null')||','||nvl(to_char(HIERARCHY_TYPE_ID),HIERARCHY_TYPE_ID||'null')||','||''''||ACCOUNT_ID||''''||','||nvl(to_char(SHORTCUT_NODE_ID),SHORTCUT_NODE_ID||'null')||','||''''||SHORTCUT||''''||','||nvl(to_char(CHECK_ID),CHECK_ID||'null')||','||nvl(to_char(CHECK_STATUS),CHECK_STATUS||'null')||','||nvl(to_char(SCHEDULE_ID),SCHEDULE_ID||'null')||','||''''||CHECKED_BY||''''||','||''''||CHECKED_DATE||''''||','||''''||ADDED_BY||''''||','||''''||ADDED_DATE||''''||','||''''||UPDATED_BY||''''||','||''''||UPDATED_DATE||''''||','||''''||NAME_1||''''||','
    ||''''||NAME_2||''''||','||''''||NAME_3||''''||');' from NODE;
    spool off;
    exit;

            最后,我们通过 Runtime.getRuntime().exec方法调用sqlplus命令,启动一个进程去执行这个脚本,得到我们的dump文件。

            我们通过输出结果看到,对于同一个表的dump文件生成,这个方法的耗时为57秒,比之前的63秒快了6秒,速度提高的并不明显。

            而且,该方法需要在服务器安装sqlplus工具,由于是通过Runtime启动进程来生成dump文件,异常的回滚操作也不太好处理。

            后来经过确认,我们需要生成的dump文件其实并不是我们这里自己生成的insert的文本文件,而是Oracle数据库导入/导出数据的一种文件格式。因此,有了下面的方案,Java项目生成oracle数据库dump文件(三)

     

    展开全文
  • Oracle数据库的备份和恢复可以通过exp/imp命令来实现,exp、imp命令需要安装Oracle客户端才能使用,生成的dump文件数据库的二进制文件。exp命令的使可以自行百度,我们在该项目的使用如下: exp admin/pwd@//...

            Oracle数据库的备份和恢复可以通过exp/imp命令来实现,exp、imp命令需要安装Oracle客户端才能使用,生成的dump文件是数据库的二进制文件。exp命令的使可以自行百度,我们在该项目的使用如下:

    exp admin/pwd@//127.0.0.1:1526/d0csmmcy tables=NODE file=./dump_file/NODE_dump_20180516143042406.dump log=./dump_log/NODE_dump_20180516143042406.log
    

            导出的具体代码:

    package com.code.dump;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class DumpFile3 {
    	/** 数据库连接参数 */
    	static final String DB_HOST = "127.0.0.1:1526";
    	static final String DB_SID = "orcl";
    	static final String DB_USER = "admin";
    	static final String DB_PWD = "pwd";
    	static final String TABLE_NAME = "NODE";
    	/** dump文件保存路径 */
    	static final String DUMP_FILE_PATH = "./dump_file";
    	/** dump日志保存路径 */
    	static final String DUMP_LOG_PATH = "./dump_log";
    	static Connection connection = null;
    
    	public static void main(String[] args) {
    		try {
    			long start = System.currentTimeMillis();
    			dumpByOracleExp();
    			System.out.println("---------------------------\n"+"all cost time is " + (System.currentTimeMillis() - start) + " ms"+"\n-----------------------------\n");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (connection != null) {
    				try {
    					connection.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	/**通过Oracle的exp命令导出*/
    	private static void dumpByOracleExp() throws Exception{
    		// 创建文件存储目录
    		File directory = new File(DUMP_FILE_PATH);
    		if (!directory.exists()) {
    			directory.mkdirs();
    		}
    		directory = new File(DUMP_LOG_PATH);
    		if (!directory.exists()) {
    			directory.mkdirs();
    		}
    		String dumpFilePath = DUMP_FILE_PATH + "/" + TABLE_NAME + "_dump_" + getTimeStamp() + ".dump";
    		//dump操作的日志目录
    		String dumpLogPath = DUMP_LOG_PATH + "/" + TABLE_NAME + "_dump_" + getTimeStamp() + ".log";
    		
    		String command = "exp " +  DB_USER + "/" + DB_PWD + "@//" + DB_HOST + "/" + DB_SID + " tables="+TABLE_NAME +" file="+dumpFilePath+" log="+dumpLogPath;
    		System.out.println("---------------------------\n" + command + "\n-----------------------------\n");
    		Process process = Runtime.getRuntime().exec(command);
    		process.waitFor();
    		printCmdOutMsg(process.getInputStream());
    		printCmdOutMsg(process.getErrorStream());
    	}
    	
    	static String getTimeStamp() {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    		return sdf.format(new Date());
    	}
    	
    	static void printCmdOutMsg(final InputStream is){
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				try{
    					System.out.println("-----------------------------------------");
    					BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("gbk")));
    					String out = reader.readLine();
    					while (out != null) {
    						System.out.println(out);
    						out = reader.readLine();
    					}
    				}catch(Exception e){
    					e.printStackTrace();
    				}
    			}
    		}).start();
    	}
    
    }
    

            程序的输出:

    ---------------------------
    exp admin/pwd@//127.0.0.1:1526/orcl tables=NODE file=./dump_file/NODE_dump_20180516143042406.dump log=./dump_log/NODE_dump_20180516143042406.log
    -----------------------------
    
    -----------------------------------------
    ---------------------------
    all cost time is 104986 ms
    -----------------------------
    
    -----------------------------------------
    
    Export: Release 11.2.0.1.0 - Production on 星期三 5月 16 14:30:42 2018
    
    Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
    
    
    连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Tes
    已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
    服务器使用 AL32UTF8 字符集 (可能的字符集转换)
    
    即将导出指定的表通过常规路径...
    . . 正在导出表                            NODE导出了       23099 行
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    EXP-00091: 正在导出有问题的统计信息。
    导出成功终止, 但出现警告。

            代码的实现逻辑就是通过Runtime.getRuntime().exec调用exp命令。另外,需要注意的是,执行exp命令的用户需要赋予exp_full_database权限。

            下面我们来比较一下三种方法的优缺点:



     

    展开全文
  • 为了减轻系统压力,需要增加归档功能,即通过归档操作,将数据库里面符合特定条件(如:交易完成)的数据进行清理。但是,由于基金交易数据的特殊性,这些被清理的数据仍需要保存,而且必要的情况下还要支持数据的...

            近期开发的项目是一个基金管理的项目,由于交易数据比较大,为了提高响应速度,在数据访问层增加了缓存机制。但是,随着系统运行了一段时间,由于缓存加载的数据量扩大,系统内存占用越来越高。为了减轻系统压力,需要增加归档功能,即通过归档操作,将数据库里面符合特定条件(如:交易完成)的数据进行清理。但是,由于基金交易数据的特殊性,这些被清理的数据仍需要保存,而且必要的情况下还要支持数据的恢复。这篇文章就是这个功能开发完成的产物。

            最开始,由于dump文件格式的不确定,加上要用Java代码生成,我们考虑生成dump文件的内容为需要归档的数据的insert语句。首先,我们通过需要归档的表名,查询user_tab_columns可以拿到该表的所有列信息(主要是列名和数据类型),然后根据表名和列信息拼成insert语句,最后加上归档条件。根据该思路,我们有了下面的代码。

    package com.code.dump;
    
    import java.io.File;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    public class DumpFile {
    	/** 数据库连接参数 */
    	static final String DB_HOST = "127.0.0.1:1526";
    	static final String DB_SID = "orcl";
    	static final String DB_USER = "admin";
    	static final String DB_PWD = "pwd";
    	static final String TABLE_NAME = "NODE";
    	/** 拼接的sql每行字符数,超过ROW_CHAR_COUNT就换行,防止sql过长 */
    	static final int ROW_CHAR_COUNT = 1000;
    	/** dump文件保存路径 */
    	static final String DUMP_FILE_PATH = "./dump_file";
    	static Connection connection = null;
    
    	public static void main(String[] args) {
    		try {
    			long start = System.currentTimeMillis();
    			String sql = generateInsertSql();
    			generateDumpFileByFile(sql);
    			System.out.println("---------------------------\n"+"all cost time is " + (System.currentTimeMillis() - start) + " ms"+"\n-----------------------------\n");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (connection != null) {
    				try {
    					connection.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	/** 生成使用的sql语句 */
    	static String generateInsertSql() throws Exception {
    		// 存储需要备份的表的列的信息(column_name,data_type)
    		List<ColumnInfo> cols = new ArrayList<ColumnInfo>();
    		// 创建oracle数据库连接
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		connection = DriverManager.getConnection("jdbc:oracle:thin:@" + DB_HOST + ":" + DB_SID, DB_USER, DB_PWD);
    		Statement sql = connection.createStatement();
    
    		// 查询需备份表的所有列信息
    		ResultSet columns = sql.executeQuery("select column_name, data_type from user_tab_columns where table_name='" + TABLE_NAME.toUpperCase() + "'");
    		while (columns.next()) {
    			ColumnInfo columnInfo = new ColumnInfo(columns.getString(1), columns.getString(2));
    			cols.add(columnInfo);
    		}
    
    		// 拼接insert的前半部分
    		// eg:insert into charge_value_lookup(RESULT_ID,TAX_IDS,FEE_IDS) values(
    		StringBuffer insertSql = new StringBuffer("insert into " + TABLE_NAME + "(");
    		int index = 1;
    		for (ColumnInfo col : cols) {
    			if (insertSql.length() > ROW_CHAR_COUNT * index) {
    				insertSql.append("\n");
    				index++;
    			}
    			insertSql.append(col.getColumnName()).append(",");
    		}
    		insertSql.delete(insertSql.length() - 1, insertSql.length());
    		insertSql.append(") values(");
    		System.out.println("---------------------------\n"+insertSql.toString()+"\n-----------------------------\n");
    
    		// 拼接sql调用的查询语句
    		// eg:select 'insert into charge_value_lookup(RESULT_ID,TAX_IDS,FEE_IDS) values(' ||''''||RESULT_ID||''''||','||''''||TAX_IDS||''''||','||''''||FEE_IDS||''''||');' from charge_value_lookup
    		StringBuffer excSql = new StringBuffer("select '").append(insertSql).append("' ");
    		index = 1;
    		for (int i = 0; i < cols.size(); i++) {
    			if (excSql.length() > ROW_CHAR_COUNT * index) {
    				excSql.append("\n");
    				index++;
    			}
    			ColumnInfo columnInfo = cols.get(i);
    			switch (columnInfo.getDataType()) {
    			case "CHAR":
    			case "VARCHAR2":
    				excSql.append("||").append("''''").append("||").append(columnInfo.getColumnName()).append("||").append("''''");
    				break;
    			case "NUMBER":
    			case "FLOAT":
    			case "LONG":
    				excSql.append("||").append("nvl(to_char(" + columnInfo.getColumnName() + ")," + columnInfo.getColumnName() + "||'null')");
    				break;
    			case "DATE":
    				break;
    			default:
    				throw new Exception("表的列类型不支持");
    			}
    			if (i != cols.size() - 1) {
    				excSql.append("||").append("','");
    			} else {
    				excSql.append("||');'");
    			}
    		}
    		excSql.append(" from " + TABLE_NAME + "");
    
    		System.out.println("---------------------------\n"+excSql.toString()+"\n-----------------------------\n");
    
    
    		return excSql.toString();
    	}
    
    	/** 通过io操作生成dump文件 */
    	private static void generateDumpFileByFile(String sql) throws Exception {
    		// 创建文件存储目录
    		File directory = new File(DUMP_FILE_PATH);
    		if (!directory.exists()) {
    			directory.mkdirs();
    		}
    		// 生成的dump文件
    		String dumpFilePath = DUMP_FILE_PATH + "/" + TABLE_NAME + "_dump_" + getTimeStamp() + ".dump";
    		if (!Files.exists(Paths.get(dumpFilePath))) {
    			Files.createFile(Paths.get(dumpFilePath));
    		}
    
    		FileChannel dumpFileChannel = FileChannel.open(Paths.get(dumpFilePath), StandardOpenOption.READ, StandardOpenOption.WRITE);
    		List<String> insertSqls = new ArrayList<String>();
    		ResultSet results = connection.createStatement().executeQuery(sql);
    		while (results.next()) {
    			String insertSql = results.getString(1);
    			insertSqls.add(insertSql);
    		}
    		System.out.println("---------------------------\n"+"rows count is :"+insertSqls.size()+"\n-----------------------------\n");
    		for (String insertSql : insertSqls) {
    			dumpFileChannel.write(ByteBuffer.wrap((insertSql + "\n").getBytes()));
    		}
    
    		dumpFileChannel.close();
    	}
    
    	static String getTimeStamp() {
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
    		return sdf.format(new Date());
    	}
    
    }
    
    class ColumnInfo {
    	private String columnName;
    	private String dataType;
    
    	public String getColumnName() {
    		return columnName;
    	}
    
    	public void setColumnName(String columnName) {
    		this.columnName = columnName;
    	}
    
    	public String getDataType() {
    		return dataType;
    	}
    
    	public void setDataType(String dataType) {
    		this.dataType = dataType;
    	}
    
    	public ColumnInfo(String columnName, String dataType) {
    		super();
    		this.columnName = columnName;
    		this.dataType = dataType;
    	}
    }

            程序的输出结果:

    ---------------------------
    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values(
    -----------------------------
    
    ---------------------------
    select 'insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values(' ||''''||TENANT_ID||''''||','||nvl(to_char(NODE_ID),NODE_ID||'null')||','||nvl(to_char(PARENT_NODE_ID),PARENT_NODE_ID||'null')||','||''''||NAME||''''||','||nvl(to_char(NODE_TYPE_ID),NODE_TYPE_ID||'null')||','||nvl(to_char(HIERARCHY_TYPE_ID),HIERARCHY_TYPE_ID||'null')||','||''''||ACCOUNT_ID||''''||','||nvl(to_char(SHORTCUT_NODE_ID),SHORTCUT_NODE_ID||'null')||','||''''||SHORTCUT||''''||','||nvl(to_char(CHECK_ID),CHECK_ID||'null')||','||nvl(to_char(CHECK_STATUS),CHECK_STATUS||'null')||','||nvl(to_char(SCHEDULE_ID),SCHEDULE_ID||'null')||','||''''||CHECKED_BY||''''||','||''''||CHECKED_DATE||''''||','||''''||ADDED_BY||''''||','||''''||ADDED_DATE||''''||','||''''||UPDATED_BY||''''||','||''''||UPDATED_DATE||''''||','||''''||NAME_1||''''||','
    ||''''||NAME_2||''''||','||''''||NAME_3||''''||');' from NODE
    -----------------------------
    
    ---------------------------
    rows count is :23099
    -----------------------------
    
    ---------------------------
    all cost time is 63195 ms
    -----------------------------   

    dump文件的内容截取了一部分:

    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values('CSMS',12275,12231,'AH3811(Asset Unit)-AH3811',6,128,'AH3811',12275,'N',2785513347,1,42,'lzsysadmin','2016051807044700','xuxj194','2010102801403483','lzsysadmin','2016051807044700','分红交易-投管-PLR-场外(资产单元)-AH3811','','');
    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values('CSMS',12276,12231,'AH3871(Asset Unit)-AH3871',6,128,'AH3871',12276,'N',2785513353,1,42,'lzsysadmin','2016051807045600','xuxj194','2010102801403491','lzsysadmin','2016051807045600','分红交易-投管-ALR-场外(资产单元)-AH3871','','');
    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values('CSMS',12185,12122,'034708LAFS(Asset Unit)-AG2G41',6,128,'AG2G41',12185,'N',null,null,null,'','','xuxj194','2010102801393155','fundPostn','2016051806431500','分红-存管-LAFS-场内-深A-0899034705(资产单元)-AG2G41','','');
    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values('CSMS',12186,12122,'B49944LAFS(Asset Unit)-AG2G42',6,128,'AG2G42',12186,'N',null,null,null,'','','xuxj194','2010102801393160','fundPostn','2016051806425500','分红-存管-LAFS-场内-沪A-B880349945(资产单元)-AG2G42','','');
    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values('CSMS',12187,12122,'124224LAFS(Asset Unit)-AG2H51',6,128,'AG2H51',12187,'N',null,null,null,'','','xuxj194','2010102801393164','fundPostn','2016051806444000','分红-存管(基金)-LAFS-场内-深A-0019124224(资产单元)-AG2H51','','');
    insert into NODE(TENANT_ID,NODE_ID,PARENT_NODE_ID,NAME,NODE_TYPE_ID,HIERARCHY_TYPE_ID,ACCOUNT_ID,SHORTCUT_NODE_ID,SHORTCUT,CHECK_ID,CHECK_STATUS,SCHEDULE_ID,CHECKED_BY,CHECKED_DATE,ADDED_BY,ADDED_DATE,UPDATED_BY,UPDATED_DATE,NAME_1,NAME_2,NAME_3) values('CSMS',12188,12122,'03470eLAFS(Asset Unit)-AG2I61',6,128,'AG2I61',12188,'N',null,null,null,'','','xuxj194','2010102801393169','fundPostn','2016051806445500','分红-存管-LAFS-场内-深A-0899034705(资产单元)-AG2I61','','');
    

            程序的思路很简单:先调用generateInsertSql()生成select  ‘insert into ...‘,再调用generateDumpFileByFile(sql)将上面生成的sql语句查询出来的结果存到dump文件。

            该方法完全依赖Java代码,逻辑和执行情况(如异常回滚操作)可控。但是,由于需要通过io写dump文件,效率比较慢,通过上面的输出我们看到,23099条数据总共花费了63秒多。另外,该方法由于需要拼接 insert into 语句,不支持CLOB、BLOB等特殊类型属性。

            为了提高dump文件的生成效率,我们有了Java项目生成Oracle数据库dump文件(二)的改造。

     

     

     

    展开全文
  • 批处理导出oracle数据库dump文件,之后可以正常导入
  • 若你的自动备份脚本如下,将其添加进cron服务执行时,可能得到的是空的dump文件, 原因:如下的tool=mysqldump ,若你是手工执行该脚本的话,是没有问题的,但是是通过cron服务自动执行,将出现空dump文件的情况,为...

    若你的自动备份脚本如下,将其添加进cron服务执行时,可能得到的是空的dump文件,

    原因:如下的tool=mysqldump ,若你是手工执行该脚本的话,是没有问题的,但是是通过cron服务自动执行,将出现空dump文件的情况,为什么呢?

    如图:这是/etc/crontab  文件,指定的命令会在path路径下寻找,而mysqldump命令是属于mysql自带的,在自己啊mysql安装的bin目录下。

    解决方法:将脚本里的tool=mysqldump  改为  tool=/usr/local/mysql/bin/mysqldump  (自己的mysql安装路径),

    即可解决问题。

    #!/bin/bash
    #保存备份个数
    number=7
    #备份保存路径
    backup_dir=/data/wwwroot/mysql_backup/netpro_admin_new
    #日期
    backdate=`date +%Y%m%d`
    #备份工具
    tool=mysqldump    问题出在这里
    #用户名
    username=root
    #密码
    password=lk@123456
    #将要备份的数据库
    database_1=netpro_admin_new
    #简单写法  mysqldump -u root -p123456 users > /data/wwwroot/mysql_backup/users-$filename.dump
    $tool -u $username -p$password $database_1 > $backup_dir/$database_1-$backdate.dump
    #写创建备份日志
    echo "create $backup_dir/$database_1-$backdate.dupm" >> $backup_dir/log.txt
    #找出需要删除的备份
    delfile=`ls -l -crt  $backup_dir/*.dump | awk '{print $9 }' | head -1`
    #判断现在的备份数量是否大于$number
    count=`ls -l -crt  $backup_dir/*.dupm | awk '{print $9 }' | wc -l`
    if [ $count -gt $number ]
    then
      rm $delfile  //删除最早生成的备份,只保留number数量的备份
      #写删除文件日志
      echo "delete $delfile" >> $backup_dir/log.txt
    fi 
    --------------------- 
    作者:it_0101 
    来源:CSDN 
    原文:https://blog.csdn.net/it_0101/article/details/79883218 

    展开全文
  • 【Oracle笔记】数据库dump导入和导出

    万次阅读 2018-04-26 22:38:05
    1、建立dump文件存放目录,并授权给Oracle用户 mkdir /data/sharedata/mydump chown -R oracle:oinstall /data/sharedata/mydump 2、配置Oracle环境变量 ORACLE_HOME=/oralce/product/11.2.0.4/dbhome PATH=$ORACLE_...
  • 11gR2数据库的日志体系变化是比较大的,下面我们从参数文件和adr两方面讨论它的变化。 一.参数文件 将spfile转换成pfile可以看出,原有的bdump、adump、cdump、u...
  • Oracle数据库event事件与dump文件介绍 Oracle数据库event事件与dump文件介绍  一、Oracle跟踪文件 Oracle跟踪文件分为三种类...
  • Oracle数据库event事件与dump文件介绍 一、Oracle跟踪文件 Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启动、关闭和运行期间后台进程的活动情况,如表空间创建、回滚段创建、某些alter命令、...
  • 环境:centos7.2软件:redis-3.2.10(yum安装) 情景一:公司之前的redis没有开启aof模式,一直是rdb模式,但是数据又非常重要,数据...数据库是空的,因为我们并没有appendonly.aof文件,而且关闭redis的时候,会把d...
  • 对oracle数据库使恢复 dump文件

    千次阅读 2015-10-14 11:21:31
    1.导入 imp username/password@SID file=XXX.dmp fromuser=XXX touser...此处我使用的是在源服务器导出的.dmp文件,直接在command中执行 如:imp posp/posp@orcl file=./pospdb1009.dmp tables=host_check igno
  • IMPDP 高版本DUMP文件导入低版本数据库? ?DUMP文件是11203的,需要导入到10201中 ?impdp导入时加version参数,参数值为数据库版本号,就可以导入到10g库里。 参考如...
  • dump文件load后数据库访问不了解决办法
  • Oracle跟踪文件分为三种类型 一、后台报警日志文件 记录数据库在启动、关闭和运行期间后台进程的活动情况,如表空间创建、回滚段创建、某些alter命令、日志切换、错误...在数据库出现故障时,应首先查看该文件,但...
  • 1.利用XShell或SSH工具连接到...3.连接到SQL后如下命令可创建或查询虚拟路径,为dump文件存放做准备 查看管理理员目录(同时查看操作系统是否存在, 因为Oracle并不关心该目录是否存在, 如果不存在, 则出错.) SQL> sele
  • 2010年5月12日 SQL> alter user scott account unlock; ...SQL> alter user scott ...exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。
  • 一、Oracle跟踪文件 ... Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启动、关闭和运行期间后台进程的活动情况,如表空间创建、回滚段创建、某些alter命令、日志切换、错误消息等。  在...
  • 踩坑过程:客户直接给了一个dump文件,啥信息也没给的前提下怎么去正确导入该dump文件 1.首先预估大约需要多少空间。。dump文件发现该文件大小54个G,保守估计导入后会扩大到一倍,所以新建一个用户,分配一个表...
  • 如题,手上有一个后缀名为dump数据库文件,说是从oracle中导出的,从新导入oracle中无法执行。从网上查了一下,oracle导出的后缀名应该是dmp文件才对,不知道如何解决?谢谢!
  • 踩坑过程:客户直接给了一个dump文件,啥信息也没给的前提下怎么去正确导入该dump文件1.首先预估大约需要多少空间。。dump文件发现该文件大小54个G,保守估计导入后会扩大到一倍,所以新建一个用户,分配一个表空间...
  • dump文件问题

    2019-12-13 23:15:59
    今天导全民参保dump文件时遇到以下几个问题,总结一下。 1.报没有启动监听程序。...2.本应是导入数据库表中,受上次导出dump文件的影响,我竟然用了expdp导出dump文件命令 3.imp 导入dump文件时,imp...
  • 首先贴出application.properties的...首先要知道springboot通过是哪个类进行加载这些数据库连接池的参数的。如果忘记了类名,就到spring-boot-autoconfigure.jar的META-INF/spring.factories org.springframework...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,610
精华内容 1,444
关键字:

数据库dump文件