1、联邦数据库操作遇到的问题:主库与从库表结构完全一样,从主库向从库导数据报错。
原因:生产系统主库字符集GBK,一个汉字占两个字符,从库utf-8,一个汉字占三个字符,所以从库字段长度应该是主库的1.5倍。
例如,主库varchar(20),从库至少应是varchar(30)。
2、对表的操作有时不需要记日志,事物太大,一旦回滚日志空间可能会爆掉,或者想节省时间。
清空表不记录日志:
ALTER TABLE DM_USER_DEV_D_200902_YMH ACTIVATE NOT LOGGEDINITIALLY WITH EMPTY TABLE
对于插入表不记日志,可用脚本运行的方式:
alter table XXX activate not logged initially locksizetable;
DML语句;
将以上语句放入脚本1.sql,运行方式:db2 +c –tvf1.sql
+c表示关闭自动提交功能。
Db2默认情况下一条dml语句执行完就会自动提交,若不用此参数,alter table XXX activate not logged initially locksize table 语句执行完毕后表的自动提交又打开了,相当于白运行了这条语句。
用此参数让整个脚本执行结束才提交,才打开表的自动提交功能。
3. 更改字段类型:
alter table tbname_top alter country_name SET DATA TYPEVARCHAR(50)
只能由varchar小改为varchar大
一般用先删再增加的方法:
Alter table XX drop column colname;
Alter table XX add column colname 类型;
4、关于db2load,详细用法 db2 ? load
db2 load from … insert/replace into …
中止load:语句的insert/replace 替成 terminate
使用“|”作为分隔符,无论是export还是load,DB2都会报SQL3017N的错误:
SQL3017N A delimiter isnot valid or is used more than once
数据库的字符集是1386,属于MBCS数据,因此定界符最大是0x3F,而“|”的ASCII码为0x7C,超过了有效范围。解决办法,是做Export或者Load操作时,增加codepage选项,让DB2自动进行字符集转换:
EXPORT TO "/data/temp/card.dat" OF DEL
MODIFIED BY codepage=1208 COLDEL|
MESSAGES "/data/temp/card.log"
SELECT * FROM BI.STG_CDR_OBS_CARD
附录(摘自官方文档):
对列定界符、字符串定界符或小数点字符指定的字符无效。
对于 SBCS 或 UTF-8 数据,定界符的有效范围是0×00 – 0x7F(包括 0×00 和 0x7F 在内)。
对于 MBCS 数据,定界符的有效范围是0×00 – 0x3F(包括 0×00 和 0x3F 在内)。
对于 EBCDIC MBCS 数据,定界符的有效范围是0×00 – 0x3F(包括 0×00 和 0x3F 在内),但是,有一种例外情况就是,定界符不能为 SHIFT-OUT(0x0E)或者 SHIFT-IN(0x0F)字符。
为多个前述项目指定了同一个字符。