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 NULL
或 PRIMARY 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
: 绕过触发器禁用步骤。