在 Firebird 2.1 中将表从一个数据库复制到另一个数据库



我需要在Firebird 2.1中将表从一个数据库复制到另一个数据库,但在某种程度上这非常快,你可以在控制台上运行它。

我使用了FBcopy,但从老板那里得到的答案是它太慢了。这必须在多个事务中完成,因为表非常大。任何想法我该怎么做?

一种可能的解决方案是使用源表(或至少:要传输的数据(的布局创建外部表,一个在源数据库中,另一个在目标数据库中。

在源数据库中,选择要从源表传输的内容,并将其插入到(空(外部表中。完成后,您可以将文件复制到其他数据库。如果它们在同一台服务器上,则可以直接使用相同的文件(我没有使用足够的外部表来指出下面指出的风险(。

然后,在目标数据库上,可以从外部表中进行选择并插入到最终目标表中。

创建和使用外部表时,请记住以下几点:

  • 外部表文件是一种固定宽度的二进制数据格式,我链接的文档显示了如何使其看起来像固定宽度的文本格式,但实际上并非如此。

  • 字符
  • 数据的正确解释取决于字符集(正确的字符转换和数据长度(,例如 UTF8 列是其声明长度的 4 倍。创建外部表时,请显式声明字符集以避免数据库之间的默认字符集不同等问题。

    使用单字节字符集与 4 字节字符集之间的差异将导致极端损坏,因为WIN1252数据库中的CHAR(100)将被写入/读取为 100 字节,但在 UTF8 数据库中,它将作为 400 字节写入/读取。所以一定要明确使用字符集,例如CHAR(100) CHARACTER SET WIN1252

  • 鉴于其未压缩的性质,如果数据允许,最好使用单字节字符集而不是例如 UTF8。

  • 外部表不支持 Blob 或数组。

  • 不能删除或更新外部表中的行。要清除它,您需要删除底层外部文件(Firebird 将在必要时自动创建一个新文件(。

  • 无法定义主键或外键约束,也无法定义外部表上的索引

为了能够使用外部表,您需要配置 Firebird 以允许它访问这些文件。在服务器firebird.conf,将ExternalFileAccess设置从默认值None更改为ExternalFileAccess = Restrict <path>,其中 path 是 Firebird 有权访问的文件夹或以分号分隔的文件夹列表。在配置文件中阅读有关此选项的文档!

一个(非常(小的例子。假设两个数据库位于同一台服务器上,并且您的数据库具有要传输的CUSTOMER表:

create table customer (
id integer constraint pk_customer primary key,
customer varchar(25) character set win1252 not null
)

然后创建等效的外部表:

create table ext_customer external file 'D:dataDBexttablesext_customer.dat' (
id integer not null,
customer varchar(25) character set win1252 not null
)

在源数据库和目标数据库中创建此表。

然后在源数据库中将客户数据放入外部表中:

insert into ext_customer (id, customer) select id, customer from customer;

确保提交。

然后,在目标数据库中,可以使用数据。例如,如果customer表当前为空,您可以简单地执行我们在 source 中所做的相反的操作:

insert into customer (id, customer) select id, customer from ext_customer;

如果您需要更多控制,请考虑查看MERGE.

这是一个老问题,但是;

您可以尝试禁用目标表上的索引。 复制数据,然后启用索引。

您还可以检查目标表上的触发器并禁用不必要的触发器。是否有任何触发器从其他表中进行选择或插入到其他表中?

您还可以在目标数据库上禁用"强制写入"。我假设您有一台带有冗余电源和 RAID 磁盘系统(或云(的服务器 复制后,您可以重新打开"强制写入"。 https://www.firebirdsql.org/pdfmanual/html/gfix-sync.html

最新更新