MySQL Workbench 手册  /  管理任务  /  wbcopytables 实用程序

6.9 wbcopytables 实用程序

wbcopytables 是 MySQL Workbench 中包含的一个命令行实用程序,它允许您将数据从支持的源数据库服务器复制到 MySQL。它被 MySQL Workbench 迁移向导用于在架构迁移并在目标 MySQL 服务器中创建后复制数据。

wbcopytables 可以使用 ODBC、Python DBAPI 或原生 MySQL 客户端库连接到源数据库。

复制操作在源数据库上执行一个 SELECT 语句,然后执行 INSERT 将检索到的行插入到目标 MySQL 服务器中。

表 6.2 文件位置(默认)

操作系统 位置
Linux /usr/bin/wbcopytables
macOS /Applications/MySQLWorkbench.app/Contents/MacOS/wbcopytables
Windows C:\Program Files\MySQL\MySQL Workbench 8.0\wbcopytables.exe

连接参数

源和目标连接的选项参数为

  • --odbc-source=ODBC_connection_string: ODBC 连接字符串的语法使用标准 ODBC 语法。您也可以使用 ODBC 数据源名称 (DSN)。

  • --mysql-source=MySQL_connection_string: 用于 MySQL 源(在执行 MySQL 到 MySQL 迁移或复制时)。它使用与 MySQL 实用程序相同的语法

    • 对于 TCP/IP 连接:username[:password]@host:port

    • 对于本地套接字连接:username[:password]@::socket_path

  • --source-password: 传递数据源的连接密码。

  • --target=MySQL_connection_string: 指定目标连接。

  • --passwords-from-stdin: 通过 STDIN 传递密码。源和目标密码必须用制表符分隔。

您可以使用源 RDBMS 中的 ODBC 特定数据源选项来指定要为源 SELECT 语句一次获取的行数。

支持 SSH 隧道以复制数据的源和目标连接的选项参数为

  • --source-ssh-port=ssh port

  • --source-ssh-host=ssh host

  • --source-ssh-user=ssh user

  • --source-ssh-password=ssh password

  • --target-ssh-port=ssh port

  • --target-ssh-host=ssh host

  • --target-ssh-user=ssh user

  • --target-ssh-password=ssh password

表规范

可以在命令行中为复制操作指定一个或多个表。有两种复制类型

  • 完整表复制:--table

  • 范围复制:--table-range

两种表复制类型都需要一组公共参数

  • 源架构: 表所属的架构或目录。如果需要引用,则必须使用源 RDBMS 中的语法。例如,SQL Server 使用 [方括号]

  • 源表: 要复制的表。如果源 RDBMS 在目录之外还使用架构名称,则此处必须指定架构和表,并用点分隔。例如,[dbo].[mytable]

  • 目标架构: MySQL 架构的名称。如果需要引用,则必须使用 MySQL 反引号语法。例如,`sakila`

  • 目标表: MySQL 表的名称。

  • 选择表达式: 要 SELECT 的字段列表。这将逐字插入到源 SELECT 语句中。

    注意

    请谨慎使用,因为此表达式将直接复制到源 SELECT 语句中。

对于选择表达式,如果源表和目标表具有相同顺序的相同字段,并且使用兼容的类型,则您只需在此处传递 *,这将构建一个类似于 "SELECT * FROM [dbo].[mytable]" 的查询。否则,您可以按在 SELECT 语句中指定字段的方式指定它们,这些字段用逗号 (,) 分隔,并使用特定于源 RDBMS 的正确转义/引用。您也可以指定源 RDBMS 支持的类型转换和/或数据转换。例如

[client_id], [name], [address], AsText([location])

由于每个选项都必须被 wbcopytables 命令解释为单个选项,因此您必须在必要时执行特定于 OS shell 的引用。通常,用 '单引号' 或 "双引号" 引用您的参数值就足够了。这将是您使用的任何数据库特定引用的补充。

完整表复制

此参数对源表执行完整的 SELECT,获取记录,然后将它们插入到目标表中。

不需要其他参数。

--table 语法如下

--table Source_Schema Source_Table Target_Schema Target_Table Select_Expression

范围复制

此参数对源表执行指定范围的 SELECT 复制。表必须具有用于创建范围的 WHERE 表达式的数字 UNIQUE NOT NULLPRIMARY KEY

--table-range 语法如下

--table-range Source_Schema Source_Table Target_Schema Target_Table Select_Expression Source_Key Range_Start Range_End

生成的表达式为

key_column >= range_start AND key_column <= range_end

如果您为 Range_End 指定 -1,则表达式为

key_column >= range_start

其他选项

  • --thread-count=Number: 如果您要复制多个表,可以使用此选项将表分配到多个线程。不支持将单个表分配到多个线程。

  • --count-only: 仅执行由 --table 选项使用的 --table 生成的 COUNT(*)。在这种情况下,可以省略目标架构和表。

  • --truncate-target: 对每个复制的目标表执行 TRUNCATE TABLE 命令。

触发器处理

由于无法在 MySQL 中暂时禁用触发器,并且触发器会影响复制过程,因此 MySQL Workbench 会在复制过程开始之前备份和删除目标 MySQL 数据库中的所有触发器,然后在复制完成后恢复这些触发器。触发器将备份到目标架构中的名为 wb_tmp_triggers 的表中。

  • --disable-triggers-on=Schema_Name: 对指定架构中的所有触发器执行备份和 DROP 过程。

  • --reenable-triggers-on=Schema_Name: 恢复先前备份到 wb_tmp_triggers 表中的触发器。

  • --dont-disable-triggers: 绕过触发器禁用步骤。