PG数据向Kingbase移植

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皓月如我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值