前提:PG和Kingbase的数据库均已创建完成。
1.整理PG数据。
--设备表
update my_dev_tab set description = 'dummy' where description is null or description = '';
--列字典表
update my_col_dict set col_name_chn = 'dummy' where col_name_chn is null or col_name_chn = '';
--列字典表
update my_col_dict set col_order = UNIQUE_INT where col_order is null;
清空或删除db_health表。
2.从PG导出数据为SQL语句脚本。
pg_dump --dbname=my_db_name --host=my_host_ip_addr --username=my_username --no-password --data-only --exclude-table-data=my_exclude_tables
--inserts --column-inserts --encoding=UTF8 --disable-dollar-quoting --file=data_only_insert_sql.backup
3.编辑脚本,使其符合Kingbase要求。
将脚本文件开头的一段:
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
SET search_path = smartsys, pg_catalog;
改为
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET search_path = smartsys;
4.清理Kingbase中表的数据。
select出schema中所有的表,生成truncate语句。然后执行之。
isql -d MY_DB_NAME -h host_ip -p 54321 -U MY_USER_NAME -W my_password -f 1_ctuncate_tabs.sql
5.禁用Kingbase中的insert触发器。
如果需要,先创建存储过程。然后执行之。
CREATE OR REPLACE PROCEDURE disable_all_insert_triggers()
AS
DECLARE
trigger_cur refcursor;
trigger_name_var varchar(128);
table_name_var varchar(128);
sql_var varchar(1024);
BEGIN
open trigger_cur for select trigger_name, event_object_table from information_schema.triggers where event_manipulation = 'INSERT' and trigger_name like 'TI_%';
LOOP
fetch trigger_cur into trigger_name_var, table_name_var;
EXIT WHEN trigger_cur%NOTFOUND;
sql_var = 'ALTER TABLE '||table_name_var||' DISABLE trigger '||trigger_name_var;
raise notice '%', sql_var;
execute immediate sql_var;
end LOOP;
close trigger_cur;
END;
call disable_all_insert_triggers();
6.执行SQL语句脚本导入数据,并记录日志。
isql -d MY_DB_NAME -h host_ip -p 54321 -U MY_USER_NAME -W my_password -f 1_data_only_utf8.sql > imp_2_kdb.log 2>&1
7.启用Kingbase中的insert触发器。
如果需要,先创建存储过程。然后执行之。
CREATE OR REPLACE PROCEDURE enable_all_insert_triggers()
AS
DECLARE
trigger_cur refcursor;
trigger_name_var varchar(128);
table_name_var varchar(128);
sql_var varchar(1024);
BEGIN
open trigger_cur for select trigger_name, event_object_table from information_schema.triggers where event_manipulation = 'INSERT' and trigger_name like 'TI_%';
LOOP
fetch trigger_cur into trigger_name_var, table_name_var;
EXIT WHEN trigger_cur%NOTFOUND;
sql_var = 'ALTER TABLE '||table_name_var||' ENABLE trigger '||trigger_name_var;
execute immediate sql_var;
end LOOP;
close trigger_cur;
END;
call enable_all_insert_triggers();
8.检查导入结果。
检查记录数:打开SQL脚本文件1_data_only_utf8.sql,统计其中出现“INSERT INTO ”的次数;打开日志文件imp_2_kdb.log,统计其中出现“INSERT 0 1”的次数。两者应相等。同时确认日志文件中没有出现“ERROR”、“WARN”、“错误”、“警告”等字样。
检查中文乱码:打开一张含有中文的表,肉眼检查一下中文字段是否为乱码。