1. 主库创建允许远程连接 + 至少具备 replication、slave 权限的 MySQL 用户
用户名解释
这边的用户 'slave_mysql'@'192.168.%' 指的是只允许 ip 以 192.168. 开头的远程主机进行连接(本地测试用的),新手建议是设置为 'slave_mysql'@'%'。注意数据库通配符的使用。
mysql -u root -p
mysql> grant replication slave on *.* to 'slave_mysql'@'192.168%' identified by '123456';
2. 主库配置文件设置
区分
[mysql] 是针对数据库客户端的配置
[mysqld] 是针对数据库服务器的配置
这边设置的是针对数据库服务器的配置:
[mysqld]
# 设置服务器ID,从服务器ID必须大于主服务器ID
server_id=1
# 启动 mysql 的二进制日志系统
log_bin=bin
# 需要同步的数据库名,如果有多个,则重复此参数,每个数据库一行
binlog_do_db=Test
# 不同步的 mysql 数据库,同上
binlog_ignore_db=mysql
binlog_ignore_db=performance_schema
binlog_ignore_db=information_schema
binlog_ignore_db=sys
; 从 mysql 8.0.x 引进的,单位:秒
binlog_expire_logs_seconds=2592000
; 旧版本可以使用如下命令,单位:天
expire_logs_days=30
3. 从库配置文件
[mysqld]
server_id=2
log_bin=mysql-bin
# 要复制的数据库
replicate_do_db=Test
# 不要复制的数据库
replicate_ignore_db=mysql
replicate_ignore_db=performance_schema
replicate_ignore_db=information_schema
replicate_ignore_db=sys
4. 查看主库 master 信息
show master status;
结果:
+------------------+----------+--------------+-------------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql-bin.000006 | 2216 | Test | mysql,performance_schema,information_schema,sys | |
+------------------+----------+--------------+-------------------------------------------------+-------------------+
1 row in set (0.00 sec)
这边特别注意的是 file、position、binlog_do_db 三个字段,分别是二进制日志文件(实现主从复制的文件),从库开始复制的位置,需要进行同步的数据库。
5. 从库,开启同步
// 注意 后面是有逗号 在的!!
mysql> change master to
mysql> master_host='192.168.1.1' , # 远程主机的IP地址
mysql> master_user='slave_mysql' , # 主库允许远程连接的用户(注意不要携带 @'%' 这些东西)
mysql> master_password='123456' , # 密码
mysql> master_log_file='mysql-bin.000006' , # 同步的日志文件
mysql> master_log_pos=2216; # 开始同步的位置
6. 从库检查是否成功开启
show slave status \G
结果
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.150.128
Master_User: slave_mysql
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 2216
Relay_Log_File: grayVTouch-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes // 必须为 yes
Slave_SQL_Running: Yes // 必须为 yes
Replicate_Do_DB: Test
Replicate_Ignore_DB:
......
1 row in set (0.00 sec)
Slave_IO_Running 和 Slave_SQL_Runniing 必须为 yes ,表示开启成功。
7. 查看效果
主库中针对同步的数据库新增(或修改)数据,然后查看从库对应的数据库。
主库
use Test;
create table if not exists test_master_slave (
id int primary key auto_increment not null ,
action char(255) ,
c_time timestamp default current_timestamp
);
从库
查看 Test 数据库有没有出现 test_master_slave 表。
8. 相关问题
1. Slave_IO_Running:connecting 问题
从库没有访问主库的权限,实际就是主库没有开启远程访问的账号。解决方法,主库新建具有远程连接的账号,从库关闭现有的主从复制进程,重新设置 master,然后在开启主从复制。
执行 步骤1
mysql> stop slave;
重复 步骤5(包含步骤5)以下步骤
2. Slave_IO_Running:no 问题
SQL 语句出现错误,导致同步进程终止。具体可以查看从库错误日志,路径:/path/to/mysql/data/userAccount.err 文件。userAccount 指的是主库所在远程主机的用户名(猜的)。
9. 更多资料(主从复制原理)