PG数据向Kingbase移植

来源:互联网 发布:17网络用语 编辑:程序博客网 时间:2024/05/20 09:07

前提: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()ASDECLARE        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()ASDECLARE        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”、“错误”、“警告”等字样。

检查中文乱码:打开一张含有中文的表,肉眼检查一下中文字段是否为乱码。

0 0
原创粉丝点击