How to migrate data from Oracle or another Schema or another openGauss to openGauss(PostgreSQL)?
在openGauss数据库后期维护中难免有数据迁移或复制, 比如从oracle异构数据迁移,或在同一个server中复制一个schema到另一schema, 或是从另一个server复制到本server, 有一些命令行工具可以高效率的处理这些需求,并且可以迁移数据不生成落地文件,提升迁移速度,这里简单记录三种需求。
1, oracle to opengauss/postgresql
如果数据较多可以使用ora2pg这类开源工具,或数据库自带的迁移工具如mogdb的MTK,但对于部分大表迁移最快的可能就是老楼的sqluldr2, 十年前第一次使用它的速度就惊到了我 ,《力挺一下sqluldr》
在实际项目中可以使用sqluldr2加gsql或/psql的copy直接把数据快速灌入og或pg。 前提需要有oracle client,可以在目标数据库服务器部署,目标端需要提前手动创建表。
./sqluldr2 scott/tiger@192.168.xxx.xxx/orcl query="select * from xxx.xxxxx" quote=0x22 field="," degree=8 file=- |gsql -d dbanbob -Uxxx -Wxxx -hlocalhost -p26000 -c "\copy xxx.xxx from stdin DELIMITER ',' quote '\"' csv"
Note:
这里需要注意的是文本字段quote符号,在gsql要求是单字符,如果列值中有特殊符号需要特殊处理。 如果表较多,可以使用shel拆分为多个任务并行处理。
2, one Schema to another Schema
对于不同的开发需求有可能需要在一个库上创建多个schema相同的数据,给不同的程序测试,可以编辑一个plsql来遍历复制数据对象。ANVESH PATEL几年有写个一个PG的这里转载一下,对于og支持的对象类型更多,需要增加plsql。
CREATE OR REPLACE FUNCTION fn_CopySchemaData(source_schema text, dest_schema text) RETURNS void AS $$ DECLARE object text; buffer text; default_ text; column_ text; BEGIN -- Create a new schema EXECUTE 'CREATE SCHEMA ' || dest_schema; FOR object IN SELECT sequence_name::text FROM information_schema.SEQUENCES WHERE sequence_schema = source_schema LOOP EXECUTE 'CREATE SEQUENCE ' || dest_schema || '.' || object; END LOOP; FOR object IN SELECT TABLE_NAME::text FROM information_schema.TABLES WHERE table_schema = source_schema LOOP buffer := dest_schema || '.' || object; EXECUTE 'CREATE TABLE ' || buffer || ' (LIKE ' || source_schema || '.' || object || ' INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING DEFAULTS)'; FOR column_, default_ IN SELECT column_name::text, REPLACE(column_default::text, source_schema, dest_schema) FROM information_schema.COLUMNS WHERE table_schema = dest_schema AND TABLE_NAME = object AND column_default LIKE 'nextval(%' || source_schema || '%::regclass)' LOOP EXECUTE 'ALTER TABLE ' || buffer || ' ALTER COLUMN ' || column_ || ' SET DEFAULT ' || default_; END LOOP; END LOOP; END; $$ LANGUAGE plpgsql VOLATILE;
Sample Execution:
select *from fn_CopySchemaData('old_schema','new_schema');
3, one server to another server
有时需要在不同的服务器上的pg或og数据库之前复制数据, 同样也可以使用gsql或psql在命令行下无落地复制数据,使用to stdout与from stdin
$ gsql \ -X \ -U user_name \ -h host_name1 \ -d database_name \ -c "\\copy tab1 to stdout" \ | \ gsql \ -X \ -U user_name \ -h host_name2 \ -d database_name \ -c "\\copy tab1 from stdin"
或者部分列
-c "\\copy (SELECT c1,c2 FROM tab1 ) to stdou
— enjoy —
对不起,这篇文章暂时关闭评论。