原文链接:https://dev.to/yugabyte/sqlcl-to-transfer-data-from-oracle-to-postgresql-or-yugabytedb-lha
原文作者:franck pachot
以前的dba有过这样的故事:oracle提供了一个“sqlloader”而没有任何“sqlunloader”,因为larry ellison 不希望他的客户搬走。 现在已经改变了:有一种简单的方法可以使用简单set sqlformat csv
的 sqlcl 导出到 csv。 关注以了解更多信息。
举个例子。 我想将一些示例数据从oracle移动到yugabytedb以比较大小。 我有一个始终免费的自治数据库,其中包括 ssb 示例模式。有一个lineorder表,大小为几百gb。 我将使用dbms_metadata获取ddl。 我必须做的唯一更改是sub(" number,"," numeric,")
禁用约束和排序规则。
当然,有一些专业工具可以将oracle模式转换为postgresql。好的旧的或 aws 也非常适合评估迁移所需的更改级别。但是对于一些快速的操作,我很擅长使用awk
😉
然后,通过设置set sqlformat csv
和一些只输出数据的设置,如feedback off pagesize 0 long 999999999 verify off
,导出就很容易了。我将所有awk
构建\copy
命令的所有内容都通过管道传递给这些 csv 行。 我喜欢先执行一些小步骤,然后在 copy 命令的开头设置 10000 行 copy(nr-data)000
命令data
。并行发送它们很容易,但我可能不需要它,因为yugabytedb是多线程的。
这是我使用的脚本 - 我在 tns_admin 中有我的自治数据库钱包,我家中安装了 sqlcl(一个 oracle 免费层 arm,我也在其上运行我的 yugabytedb 实验)。
{
tns_admin=/home/opc/wallet_oci_fra ~/sqlcl/bin/sql -s demo/",,p455w0rd,,"@o21c_tp @ /dev/stdin ssb lineorder <0 && (nr-data)00000==0{
print "\\."
print "\\copy "table" from stdin with csv"
}
end{
print "\\."
}
'
输出可以直接通过管道传输到psql
😎
这是我开始加载时的屏幕:
这是一个实验,测量运行时间没有意义,但我查看了rows_inserted
统计信息,以验证所有数据都分布在分布式sql数据库的3个节点上。 即使使用单个客户端会话,负载也会分布在所有集群上。
这对于postgresql也是一样的,因为它们是相同的api: yugabytedb在分布式存储上使用了postgresql。
此测试中的所有组件都是免费且易于使用的:
- 虚拟机位于 oracle 云免费层 (arm) 上,oracle 数据库是免费的自治数据库 👉
- postgresql 是开源免费的👉
- yugabytedb 是开源免费的👉