mysql - 制作新的 MYSQL 复制

标签 mysql database-replication

我需要进行从主到从的 mysql 复制。 (已经尝试过一次)

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

数据库有MyIsam和innoDB引擎并且都在编写中 我认为我唯一的选择是将数据文件从主服务器复制到新的从服务器? (或者制作一个数据库转储,我稍后将在第 2 轮主题中提到)

在此之前,我必须运行所有使用数据库的服务并 对表进行写锁还是应该关闭整个数据库?

将数据目录同步到新的复制服务器后,我启动了它,并且包含表的数据库就在那里。我通过将 bin.log 更改为 007324 并将位置更改为 0 摆脱了第一个错误。

错误1:

140213 4:52:07 [错误] 从二进制日志读取数据时出现 fatal error 1236:“无法在二进制日志索引文件中找到第一个日志文件名” 140213 4:52:07 [注意]从属 I/O 线程退出,读取日志“bin-log.007323”,位置 46774422

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

错误2:

查询时出现错误“文件中的信息不正确:‘./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 是一个不错的选择。

在从属服务器上:

    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

最佳答案

意识到发出 SOURCE 命令与从 shell 运行转储 SQL 的导入相同。无论哪种方式,都需要很长时间。除此之外,您的步骤正确 - 在主服务器上使用读锁刷新表,对主服务器进行数据库转储,确保记下主服务器二进制日志坐标,在从属服务器上导入转储,设置二进制日志坐标,开始复制。不要使用原始二进制文件,除非你真的知道你在做什么(特别是对于 INNODB 表)。

如果您有许多大型表(即不仅仅是一个大表),您可以考虑按表(或表组)并行转储/导入以加快速度。实际上有一些工具可以帮助您做到这一点。

您可以使用原始二进制文件,但这不适合胆小的人。过去,我使用 rsync 来差异化更新主服务器和从服务器之间的原始二进制文件(在执行此操作之前,您仍然必须使用带读锁的刷新表并收集主二进制日志坐标)。对于 MyISAM 表来说,这实际上工作得很好。对于 InnoDB 来说,这可能更加棘手。我更喜欢使用选项来设置 InnoDB 为每个表写入索引和数据文件。您需要 rsync ibdata* 文件。您将从从服务器中删除 ib_logfile* 文件。

这整件事有点高调,所以除非你没有其他可行的选择,否则我不会这样做。在考虑尝试二进制文件同步之前,绝对要先进行传统的 SQL 转储,并且每次都要进行一次,直到您真正知道自己在做什么为止。

关于mysql - 制作新的 MYSQL 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21891079/

相关文章:

java - 我需要锁定行以防止其他事务读取

mysql - 复选框列表选择的项目未获得选择并在字符串中插入空白值

php - 使用 PHP 和 MySQL 如何使用另一个表中的某些字段值填充一个表

mysql - 轮换 mariadb bin-relay 日志

MySQL information_schema.columns 额外列选项

PHP 不会持续下去,如果

postgresql - Postgres : How do I safely remove a replica?

mysql - Percona:无法检测到差异,因为没有找到奴隶

database - 为什么在数据库复制中从机读取速度比主机快

java - Zookeeper/Chubby -vs- MySql NDB