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 —