DB2不同实例相同数据库名的数据库复制方法


在linux中安装了DB2两个实例db2inst1和db2inst2,现在要将实例中db2inst1的testdb数据库复制到db2inst2中的testbd数据库,下面具体的实现步骤:

--------------------db2inst1--------------------------------

  1. 在db2inst1上创建并进入数据备份存放目录
$ mkdir /home/backup/mydata   --创建目录
 $ chown -R 777 /home/backup/mydata  --目录授权
 $ cd /home/backup/mydata --进入目录
  1. 导出数据库表结构
$ db2look -d <dbname> -e -a -x -i <username> -w <password> -o data.sql
 或 
 $ db2look -d <db2name> -e -a -x -i <username> -w <password> -o data.sql
 例如:
 $ db2look -d testdb -e -a -x -i db2inst1 -w qwert12345 -o testdb.sql
 
 参数说明:
  -d:数据库名称,必须指定
  -e:提取复制数据库所需的DDL文件
  -a:为所有创建者生成统计信息
  -x:生成授权语句DDL,不包含对象的原始定义者
  -i:登录数据库所在服务器的用户ID
  -w:登录数据库所在服务器的密码
  -o:将输出重定向到给定的文件名
 编辑得到的DDL文件
 使用db2look得到的DDL文件无法直接使用,因为其中存在一些与当前系统相关的特殊信息,所以需要对该文件进行编辑。共有几个方面:
 1.去掉文件头、尾的指令:
 	connect to testdb:
 	.........
 	commit work;
 	connect reset:
 	terminate;
 	位于这几句指令之间的就是定义该数据库的DDL语句,去掉这几句话让这个文件变成一个纯粹的DDL文件,另外,有时候很容易发生DB2指令执行错误,将四句指令放到文件外手动执行更有助troubleshooting(故障排除)
 2.去掉scheme name.
 	在本案例中scheme name是db2inst1.因为在进行异种平台的数据移动的时候会发生scheme name的变化,最常见的就是从unix类系统迁移到windows平台的时候,它缺省的schema name分别为db2inst1,db2admin1.
 3.去掉全部引号
  	此经验主要来自Oracle,一个object,定义它的时候,使用了引号与没有使用引号是两个不同的object.
 4.去掉create table语句中指定的tablespace
 	这个原因与2类似,在数据移动的过程中,tablespace name发生变化是很经常的事情,所以不要指定,让(不同的)系统自己决定。有一点非常重要,需要强调,若存在比较大的字段,就必须创建pagesize比较大的bufferpool,在创建一个tablespace使用该bufferpool.
  1. 导出数据库数据(导出指定的数据库中的全部数据)
语法:
 $ db2move <dbname> export -u <username> -p <password>
 示例:
 $ db2move testdb export -u db2inst1 -p qwert12345
 说明:
 	dbname:数据库名称
 	-u:登录数据库的用户id
 	-p:登录数据库的用户密码
 1.这将会把数据库testdb中的全部数据提取到当前目录(/home/backup/mydata)中,每个表的内容都存储在一个.ixf文件中.每个.ixf文件都有一个与之相对应的.msg文件,.msg文件是描述从表中导出的数据时的信息。另外还两个文件,db2move.lst用来记录.ixf文件、.msg文件与表的一一对应关系,EXPORT.out记录的是导出数据时的屏幕输出信息
 2.将db2move.lst对应关系文件中的实例名db2inst1修改为db2inst2,系统SYSTOOLS的可以不调整
 	修改前:
 	!"SYSTOOLS"."HMON_ATM_INFO"!tab1.ixf!tab1.msg!
 	!"SYSTOOLS"."HMON_COLLECTION"!tab2.ixf!tab2.msg!
 	!"DB2INST1"."MYTABLE"!tab3.ixf!tab3.msg!
 	!"SYSTOOLS"."POLICY"!tab4.ixf!tab4.msg!
 	!"DB2INST1"."STUDENT"!tab5.ixf!tab5.msg!
 	!"DB2INST1"."TEST"!tab6.ixf!tab6.msg!
 	修改后:
 	!"SYSTOOLS"."HMON_ATM_INFO"!tab1.ixf!tab1.msg!
 	!"SYSTOOLS"."HMON_COLLECTION"!tab2.ixf!tab2.msg!
 	!"DB2INST2"."MYTABLE"!tab3.ixf!tab3.msg!
 	!"SYSTOOLS"."POLICY"!tab4.ixf!tab4.msg!
 	!"DB2INST2"."STUDENT"!tab5.ixf!tab5.msg!
 	!"DB2INST2"."TEST"!tab6.ixf!tab6.msg!

--------------------db2inst2--------------------------------
4. 创建数据库(在实例db2inst2中)

1.创建数据testdb:db2 create db dbname on 存放路径 using codeset 字符编码 territory 地区
		$ db2 create db testdb on '/home/db2inst2' using codeset UTF-8 territory CN
  1. 连接数据库
$ db2 connect to testdb user db2inst2 using qwert12345

 2.创建一个pagesize为16k的bufferpool,名为mybigpool:(此步可省略)
 	$ db2 create bufferpool mybigpool immediate size 1000 pagesize 16k
 3.创建一个tablespace使用上面创建bufferpool,名为mybigspace:(此步可省略)
 	$ db2 "create regular tablespace mybigspace pagesize 16k managed by system using ('/home/db2inst2/db2inst2/NODE0000/SQL00004/SQLT0001.0') extentsize 16 overhead 12.67 prefetchsize 16 transferrate 0.18 bufferpool mybigpool dropped table recovery off" 
  	
 	注释:
 		extentsize,overhead, prefetchsize,transferrate这几个参数与所使用的的服务器有关
  1. 导入表结构
db2 -tvf data.sql 
 注:(t:代表终止语句字符,v:回送当前命令,f:读取输入文件)
  1. 导入数据
语法:
 $ db2move <dbname> import -u <username> -p <password>
 示例:
 $ db2move testdb export -u db2inst2 -p qwert12345