mysql-utilities工具之MySQL数据库拷贝工具mysqldbcopy

0    144    1

Tags:

👉 本文共约2481个字,系统预计阅读时间或需10分钟。

mysqldbcopy

从源服务器上拷贝一个数据库到另一个目标服务器上。源服务器和目标服务器可以同一台,也可以是不同台。数据库名字也可以相同或不相同。如果源服务器和目标服务器同一台,那么数据库名字必需不一样的,也就是同一个实例下,不能有相同的数据库名。

mysqldbcopy 接受一个或多个数据库对。格式为db_name:new_db_name。分别表示源和目标。

默认情况下,复制所有对象(如表、视图、触发器、事件、存储过程、函数和数据库级别权限)和数据到目标。可以有选择性的复制,如只复制部分对象,不复制数据等等。

要针对性的复制,可以使用--exclude选项来排除。格式如下:db.obj 。也可以使用搜索模式,如--exclude=db1.trig1 排除单个触发器, --exclude=trig_排除所有以trig开头的对象。

默认情况下,目标上使用的存储引擎与源相同。如果目标上使用另一种存储引擎,可以使用--new-storage-engine 选项来指定。如果目标服务器支持指定的引擎,那么所有表使用该引擎。

如果目标服务器不支持源服务器所用的存储引擎,可以使用--default-storage-engine选项来指定默认使用的存储引擎。 --new-storage-engine选项的优先级高于--default-storage-engine。如果这两个选项都指定,然而又不支持指定的存储引擎,那么默认的代替。

默认情况下,复制操作是使用一致性快照来读取源数据库。要改变锁定模式,可以使用--locking选项来指定锁定类型值。值no-locks关闭锁,lock-all只使用表锁。默认是snapshot。此外,使用WRITE锁,在复制过程中将锁定目标表。

从主或者从服务器复制还可以包含复制语句。--rpl选项指定

  • master 创建并执行CHANGE MASTER 语句,将目标服务器作为--source选项指定的服务器的从。在复制数据之前,执行 STOP SLAVE 语句。在复制完成后执行 CHANGE MASTER 和 START SLAVE语句。
  • slave 创建和执行 CHANGE MASTER 语句,使目标服务器成为与--source选项指定的服务器的同一个主服务器的从。仅仅在源服务器是从有用。

语句的执行先后顺序,可以将general_log打开,可以看到每步的执行过程。

MySQL Utilities

--repl-user选项指定复制的用户名和密码。

如果要复制的数据库的服务器上启用了GTIDs(GTID_MODE = ON),如果只复制其中一部分数据库,将会有警告信息产生。这是因为GTID报表生成包括所有数据库的gtids,不仅仅是某个的。

如果有启用GTID,但是使用了--skip-gtid也会收到警告。

如果启用了GTID,最好是复制所有的数据库。

必需提供连接参数和赋予要访问对象的适当权限。

源服务器上要复制的数据库,所需要的权限有:SELECT、SHOW VIEW、EVENT、TRIGGER,同时需要对mysql库有SELECT权限。

目标服务器上所需要的权限有:CREATE、 ALTER、 SELECT、 INSERT、 UPDATE、 LOCK TABLES,如果有使用--drop-first选项就需要 DROP权限。如果二进制日志启用就要SUPER权限。CREATE VIEW 、CREATE ROUTINE、 EXECUTE、EVENT、TRIGGER、GRANT OPTION 、SUPER。

在同一个实例上复制,--rpl选项是无效的,将会产生一个错误。

当复制数据和包含GTID命令,可能会遇到"GTID_PURGED can only be set when GTID_EXECUTED is empty"错误。产生的原因是目标服务器不是一个干净的复制状态。解决办法是在复制之前,先在目标服务器上执行 RESET MASTER 命令,清空复制状态。

实例

在同一个实例上复制ttlsa_com库

MySQL Utilities

如果要复制的数据库并不是所有的表是innodb引擎的,为了确保数据的一致性,在读取的过程中需要锁定表。可以使用 --locking=lock-all 选项命令。如下所示:

MySQL Utilities

从主拷贝到从,源服务器是主,目标服务器是从。如上所见。

从从拷贝到另一台服务器上,与从具有相同的主。如上所见。

不想拷贝ttlsa_com.data表:

默认情况下是LIKE匹配。使用正则,需要指定--regexp选项,同时,正则表达式只需写对象的匹配模式,不必加上数据库名。

上面,那样写有问题的。使用正则排除t开头的表

使用正则排除t或b开头的表

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

权限

源服务器:SELECT, SHOW VIEW, EVENT ,TRIGGER

目标服务器:CREATE, ALTER, SELECT, INSERT, UPDATE, LOCK TABLES, DROP,SUPER权限取决于对象DEFINER的值。

如何复制数据库

不管你是出于什么目的,复制数据库到另一个地方,mysqldbcopy将是最佳最高效的可选方案。

复制整个实例的数据库:

复制整个数据库,不允许更改数据库名称。如果要重命名,必需每次指定。

可以设置的锁定类型有:

  • no-locks 不使用任何表锁
  • lock-all 使用表锁,无事务和一致性读
  • snapshot 默认,单一事务的一致性读

如果在复制过程中出现错误,复制中止了,目标数据库可能不一致了。在这种情况下,删除已复制的数据库,修复失败的原因,然后再次复制。

我的示例

mysqldbcopy --source=root:lhr@192.168.66.35:3317 --destination=root:lhr@192.168.66.35:3318 lhrdb:lhrdb1 --drop-first

拷贝一个数据库,MySQL 5.7需要设置以下参数:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

set global log_bin_trust_function_creators=on

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部