进行新的MYSQL复制

时间:2014-02-19 19:59:24

标签: mysql mysqldump database-replication

我需要在master到slave之间进行mysql复制。 (曾尝试过一次)

数据库非常大(超过100GB),需要几个小时才能为新的奴隶做好准备。

数据库有MyIsam和innoDB引擎,两者都在编写 我认为我唯一的选择是将数据文件从master复制到新的slave? (或者进行后面在ROUND 2主题中引用的数据库转储)

在此之前,我必须运行使用数据库的所有服务 为表格制作writelock或者我应该关闭整个数据库吗?

在数据目录同步到新的复制服务器之后,我启动了它,并且带有表的数据库就在那里。通过将bin.log更改为007324并将其置于0来消除我的第一个错误。

错误1:

140213 4:52:07 [错误]从二进制日志中读取数据时,从主服务器“无法在二进制日志索引文件中找到第一个日志文件名”[ERROR]发生致命错误1236 140213 4:52:07 [注意]从属I / O线程退出,读取到记录'bin-log.007323',位置46774422

之后我从数据库中遇到了新问题,每个表都出现了这个错误。

错误2:

错误'文件中的信息不正确:'。/ database / table.frm''查询。默认数据库:'database'。

似乎出了点问题。

ROUND 2!

在这个场景之后,我开始认为这可以在没有长时间服务中断的情况下完成。

主数据库已经配置好,可以正常使用另一个从属设备。

所以我做了一些谷歌搜索,这就是我想出来的。

对表进行读锁定:

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的

1 个答案:

答案 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转储,每次直到你非常舒服,实际上你知道自己在做什么。