主库的所有更新操作都会记录到主库的binlog文件中。从库通过读取主库的binlog文件,在从库的本地数据库中重新应用这些更新。在没有特别指定的情况下,主库的所有binlog事件都会在从库中应用。当然,你也可配置从库只执行特定的事件以更新特定的库或表。
不同的从库维护各自的binglog坐标(文件名和文件中的位置),也就是说不同的从库复制的进度是不一样的,各自维护自己的复制进度。一个从库与主库的连接或断开,并不影响主库以及其他从库。
主库和它的所有从库必须配置不同的ID(server-id配置项),另外,所有从库必须配置主库的主机名,binlog文件名,binlog文件内的位置等信息。
配置步骤:
- 在主库服务器上确认已开启binlog功能,并且为服务器配置一个唯一的ID。这需要重启MySQL服务。
- 为所有从库服务器配置唯一的ID。这需要重启MySQL服务。
- 为复制功能创建单独的用户账号。
- 根据从库原始数据的创建方式,记录要从主库开始复制的主库binlog坐标(主库binlog文件名以及该文件的读取位置)。
- 在从库中配置Replication信息,如主库服务器主机名,复制用户名及密码,binlog文件名,binlog文件读取位置。可以在从库中执行change master to语句完成这项工作。
主库配置:
在my.cnf配置文件中配置:
server-id=xxx (确保server-id的唯一性)
log-bin=/path/basename (开启主库binlog,path为binlog存放路径,basename为binlog文件名)
从库配置:
- 配置server-id:确保server-id的唯一性
- 配置binlog:在从库上是否开启binlog,取决于Replication的复制结构。如A -> B -> C,B是A的从服务器又是C的主服务器,在这种复制结构下,B服务器需要开启binlog。log_slave_updates=1开启从库binlog,默认是开启状态。如果你想关闭binlog功能,可以配置skip-log-bin和skip-log-slave-updates。
创建复制账号:
从库通过该账号连接出库进行复制操作。该账号需要REPLICATION SLAVE权限。
mysql> CREATE USER 'repl'@'slavehost' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slavehost';
确定主库binlog坐标:
为了正确设置从库复制的起始位置,你需要获取主库binlog坐标(binlog文件名及文件开始位置)。
以下为获取binlog坐标几种常用方式:
1、如果主库MySQL服务可以停,则关闭主库MySQL服务,将主库物理文件拷贝至从库。重启主库MySQL服务时,主库会新建binlog文件。因此,从库只需指向这份新的binlog文件开始复制就可以了。但这需要停止主库MySQL服务,在生产环境中几乎是不可能的。
2、加全局读锁,记录当前状态的binlog坐标,然后拷贝数据到从库(物理拷贝或用mysqldump)。拷贝完成后,解除全局读锁。从库从记录的binlog坐标开始复制。
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
这种方式会阻塞全部的写操作,只适用于无写入和更新要求的时段(通常在夜晚)
3、使用mysqldump导出数据并使用--master-data选项。
shell> mysqldump --all-databases --master-data > dbdump.db
使用这条命令导出的数据中包含change master to语句,该语句中已包含binlog坐标。不过--master-data选项也会在导出数据前先执行FLUSH TABLES WITH READ LOCK。所以,在整个导出过程中也会阻塞全部的写操作,与第2中方式效果一样,只不过更方便一些,它把binlog坐标直接写入了导出的文件中。
4、使用mysqlbackup或percona-xtrabackup等工具,这些工具会自动记录binlog坐标。在使用InnoDB引擎的情况下,推荐使用这些工具。