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 TABLE。A 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