首页 » ORACLE 9i-23c, PostgreSQL/GaussDB » How to migrate data from Oracle or another Schema or another openGauss to openGauss(PostgreSQL)?

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 —

打赏

对不起,这篇文章暂时关闭评论。