什么是 MySQL 主从复制
MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。可以简单理解为,主数据库数据有任何变化,从数据库都会跟着变化。
为什么需要主从复制
- 当主服务器出现问题时,可以切换到从服务器。提高可用性
- 在从服务器可以执行查询工作,降低主服务器压力。读写分离
- 在从服务器进行备份,避免备份期间影响主服务器服务。容灾
主从复制流程
- 从库生成两个线程,一个 I/O 线程,一个 SQL 线程;
- I/O 线程去请求主库的 binlog,并将得到的 binlog 日志写入 relay log(中继日志)中;
- 主库会生成一个 log dump 线程,用来给库从库 I/O 线程传 binlog;
- SQL 线程会读取 relay log 文件中的日志,并解析成具体操作,来实现主从的操作一致,最终数据一致。
配置流程
配置主节点
启用 binary log,指定 server id。
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=testpt
重启让配置生效
service mysqld restart
登录mysql并检查master状态
# 登录mysql数据库
$ mysql -uroot -p
# 查看master的状态
mysql> show master status;
创建用于备份的用户
mysql> CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
mysql> ALTER USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
锁定主数据库
锁定主数据库,只允许读取不允许写入,这样做的目的是防止备份过程中或备份完成之后有新数据插入,导致备份数据和主数据数据不一致。
mysql> FLUSH TABLES WITH READ LOCK;
获取当前 binary log File 和 Position 信息, 记下来备用。
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000014
Position: 1024555439
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
备份主数据库
使用mysqldump工具, 先导出主数据库数据,并在开始复制前导入从数据库。
下面的例子将所有库的数据都导出到一个名叫 dbdump.db 的文件,同时使用 `--source-data`参数,该参数会自动添加从数据库开始复制进程所需的 `CHANGE REPLICATION SOURCE TO` 语句。
$ mysqldump --databases <db_name> -u<username> -p'<password>' --source-data > dbdump.sql
如果只需要备份特定的数据库,使用 `--databases` 参数。
导入数据到从数据库
$ mysql -u<username> -p<password> < dbdump.sql
备份完成后,可以校验一下数据是否完整。
配置从节点
[mysqld]
server-id=2 # 保持唯一
log-bin=mysql-bin # 二进制文件的名称
配置好之后,重启mysql服务。
然后配置主从连接。
mysql> CHANGE REPLICATION SOURCE TO SOURCE_HOST='<source ip>', SOURCE_PORT=3306, SOURCE_USER='replica', SOURCE_PASSWORD='<password>', SOURCE_LOG_FILE='mysql-bin.000002', SOURCE_LOG_POS=2223026;
启动主从复制。
mysql> START REPLICA;
检查从节点状态,如果Slave_IO_Running 和 Slave_SQL_Running 都是Yes,说明开启主从复制过程成功。
mysql> SHOW REPLICA STATUS\G
*************************** 1. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: localhost
Source_User: repl
Source_Port: 13000
Connect_Retry: 60
Source_Log_File: source-bin.000002
Read_Source_Log_Pos: 1307
Relay_Log_File: replica-relay-bin.000003
Relay_Log_Pos: 1508
Relay_Source_Log_File: source-bin.000002
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
......
解锁主数据库
接触主数据的锁定状态。
UNLOCK TABLES;