跨服务器备份/还原MySQL表

Login_DB和User_DB分布在2台mysql服务器。Uin和UserName的对应关系存放在User_DB,Login_DB只有uin。

所以导出Login流水时,无法直接关联UserName,不方便。


因为对一致性没有要求,不需要强同步。所以懒得费周章的去弄主从,网上找了下资料,实现方法so easy,在Login_DB上运行:

1、shell> mysqldump -h$User_DB_Svr_IP --add-drop-table -u $MySQL_User $DataBase_Name $Table_Name1 $Table_Name2 > Result.sql

2、shell> mysql -u $MySQL_User $DataBase_Name < /data/Result.sql


查好命令,写个脚本丢到crontab就好。先手动跑一次试试,结果遇到的报错:

mysqldump: Got error: 1044: Access denied for user '$MySQL_User'@'$IP' to database '$DataBase_Name' when doing LOCK TABLES

啥?!mysqldump备份时,还要锁表?!

在生产环境锁表可能带来一堆麻烦事,怎么破?

再次祭出大招:Google,,,原来mysqldump可以加个参数:--single-transaction

下文翻译自:http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html#option_mysqldump_single-transaction

该选项设置事务隔离模式REPEATABLE READ,并在 dumping data 之前发送一个START TRANSACTION SQL 的状态到服务器。该选项仅对事务表有用,如 InnoDB,因为dump数据库的一致状态时,START TRANSACTION 不会阻塞应用。

使用该选项时应牢记,只有 dump InnoDB表时会保持一致状态。例如,dump 任何 MyISAM 或 MEMORY表时,就算用了此选项,仍可改变状态。

MySQL 5.5.3以前的版本中,当 --single-transaction dump 进行时,确保有效的dump文件(正确的表内容和二进制日志坐标) ,没有其他的连接应使用以下语句:ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLEA consistent read没有被从这些状态中隔离,所以在dump时使用前面的语句会导致mysqldump 执行 SELECT 取到的内容包含不正确的数据或直接失败。从MySQL 5.5.3开始,metadata(元数据) locking可防止这种情况。

--single-transaction 和 --lock-tables 是互斥的,因为 LOCK TABLES 导致任何pending的事务被隐式的提交.

该选项不支持MySQL 集群 tables,NDBCLUSTER 存储引擎仅支持 READ_COMMITTED 事务隔离级别,不能保证结果的一致性。你应该总是使用 NDB 备份和还原。

dump大表时,结合 --single-transaction 和 --quick 选项。


mysql> select version();

好吧,mysql版本确实有点旧了,下次找个时间升级5.6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值