我需要在master到slave之间进行mysql复制。 (曾尝试过一次)
数据库非常大(超过100GB),需要几个小时才能为新的奴隶做好准备。
数据库有MyIsam和innoDB引擎,两者都在编写 我认为我唯一的选择是将数据文件从master复制到新的slave? (或者进行后面在ROUND 2主题中引用的数据库转储)
在此之前,我必须运行使用数据库的所有服务 为表格制作writelock或者我应该关闭整个数据库吗?
在数据目录同步到新的复制服务器之后,我启动了它,并且带有表的数据库就在那里。通过将bin.log更改为007324并将其置于0来消除我的第一个错误。
140213 4:52:07 [错误]从二进制日志中读取数据时,从主服务器“无法在二进制日志索引文件中找到第一个日志文件名”[ERROR]发生致命错误1236 140213 4:52:07 [注意]从属I / O线程退出,读取到记录'bin-log.007323',位置46774422
之后我从数据库中遇到了新问题,每个表都出现了这个错误。
错误'文件中的信息不正确:'。/ database / table.frm''查询。默认数据库:'database'。
似乎出了点问题。
在这个场景之后,我开始认为这可以在没有长时间服务中断的情况下完成。
主数据库已经配置好,可以正常使用另一个从属设备。
所以我做了一些谷歌搜索,这就是我想出来的。
对表进行读锁定:
FLUSH TABLES WITH READ LOCK;
转储:
mysqldump --skip-lock-tables --single-transaction --flush-logs --master-data=2 -A > dbdump.sql
包装和搬运: gzip(pigz)dbdump并在从转储中找到MASTER_LOG_FILE和MASTER_LOG_POS后将其移动到从属服务器。
之后我认为我不想导入dbdump.sql,因为它超过100GB和 需要时间。所以我认为SOURCE可以选择它。
在SLAVE服务器上:
CREATE DATABASE dbdump;
USE dbdump;
SOURCE dbdump.db;
CHANGE MASTER TO MASTER_HOST='x.x.x.x',MASTER_USER='replication',MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=X;
start slave;
SHOW SLAVE STATUS \G
我还没有测试过这个,我还有什么想法吗?
- bp的
答案 0 :(得分:1)
认识到发出SOURCE命令与从shell运行转储SQL的导入相同。无论哪种方式,都需要很长时间。除此之外,你还有正确的步骤 - 在master上使用read lock刷新表,进行master的数据库转储,确保你注意master binlog坐标,在slave上导入dump,设置binlog坐标,开始复制。不要使用原始二进制文件,除非你真的知道你在做什么(特别是对于INNODB表)。
如果您有许多大表(即不只是一个大表),您可以考虑按表(或表组)并行化转储/导入以加快速度。实际上有一些工具可以帮助你做到这一点。
你可以使用原始二进制文件,但它不适合胆小的人。在过去,我使用rsync来差异更新主服务器和从服务器之间的原始二进制文件(在执行此操作之前,您仍然必须使用具有读锁定的刷新表并收集主binlog坐标)。对于MyISAM表,实际上效果非常好。对于InnoDB,它可能更棘手。我更喜欢使用选项来设置InnoDB来为每个表写入索引和数据文件。您需要rsync ibdata *文件。您将从slave删除ib_logfile *文件。
这一切都是一个很高的线索,所以除非你没有其他可行的选择,否则我不会采取这样做。在考虑尝试二进制文件同步之前,绝对采用传统的SQL转储,每次直到你非常舒服,实际上你知道自己在做什么。