Mysql 主从复制配置方式 M-S(一主一从)
1 实验环境:
master:192.168.128.20
slave: 192.168.128.30
mysql 源码安装,版本:5.7.17
2 master 主库配置
1)源码安装mysql,保证主从两边版本,数据文件完全一致
这里,之间采用已经编译完成的mysql,之间解压到 /usr/local下即可使用,日常可以对主库,然后从库恢复备份即可
[root@db_master ~]# tar xf mysql.tar.gz -C /usr/local
[root@db_master ~]# echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile # 配置mysql 环境变量
[root@db_master ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #配置启动脚本
2)更改master 配置文件
[root@db_master ~]# vim /etc/my.cnf
[mysqld]
log_bin=/backup/master #开启bin_log日志
log_bin_index=/backup/master
innodb_file_per_table=1 #设置独立表空间
basedir = /usr/local/mysql
datadir = /data #设置数据存放位置
port = 3306
server_id = 20 #server_id 主从库不能一样,一般采用ip地址最后面段地址
socket = /tmp/mysql.sock #指定套接字
3)启动master mysql ,数据库全备
[root@db_master ~]# mysqld --initialize --use=mysql
[root@db_master ~]# mysqld_safe --initialize --user=mysql
[root@db_master ~]# mysqladmin -p'Ch_S,Su=w0P1' password "redhat";
[root@db_master ~]# mysqldump -p'redhat' --all-databases --single-transaction --master-data=1 --flush-logs > `date +%F`-mysql-all.sql
[root@db_master ~]# ls
2018-10-27-mysql-all.sql
--all-databases 备份所有数据库文件
--master-data=1 –master-data可以为1也可以为2,为1则二进制日志中授权的一步不会被注释掉,为2则没有
--single-transaction
--flush-logs
[root@db_master ~]# scp 2018-10-27-mysql-all.sql 192.168.128.30:/root # 备份文件拷贝给从库
4)主库给从库授权
mysql> grant replication slave on *.* to 'rep'@'192.168.128.30 identified by 'redhat';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
从库测试授权账户是否可用:
[root@db_slave1 ~]# mysql -urep -p'redhat' -h 192.168.128.20 # 注意: 后面ip地址为主库ip,意思为从库通过授权账户‘rep’去连接主库
5) 查看主库的状态
mysql> show master status\G
*************************** 1. row ***************************
File: master.000004
Position: 600 #bin_log 日志位置,从600 开始
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
3 Slave 从库配置
1) 修改从库配置文件
[root@db_slave1 ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /data
port = 3306
server_id = 2 #主要修改server-id ,区分主和从的数据
socket = /tmp/mysql.sock
[root@db_slave1 ~]# mysql_safe --initialize --user=mysql
[root@db_slave1 ~]# ss -anpt|grep 3306
LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=12332,fd=22))
2) 导入主库数据文件
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>source /root/2018-10-27-mysql-all.sql #从库恢复数据,验证两边数据是否一致
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| teamsun |
+--------------------+
5 rows in set (0.00 sec)
3)从库登陆主库,测试授权
[root@db_slave1 ~]# mysql -urep -p'redhat' -h 192.168.128.20 #从库用授权账户 rep ,登陆主库ip
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
4) 配置主从同步
[root@db_slave1 ~]# mysql -uroot -p'redhat'
mysql> change master to
-> master_host='192.168.128.53',
-> master_user='rep',
-> master_password='redhat',
-> master_port=3306,
-> master_log_file='master.000004', #如果采用source /root/2018-10-27-mysql-all.sql 方式导入数据库,change master to 不用写 log_file 和 log_pos, sql备份文件中已经指明了log_file 和log_pos
-> master_log_pos=600;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
5)启动从服务器角色
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
6)确认主从同步是否生效
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.128.53
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master.000004
Read_Master_Log_Pos: 600
Relay_Log_File: db_slave1-relay-bin.000002
Relay_Log_Pos: 317
Relay_Master_Log_File: master.000004
Slave_IO_Running: Yes #主要确认 IO 和SQL 两个线程是否启用,如果yes 说明主从复制正常
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
……
4 测试
主库上,给teamsun.t1表中插入几条数据,从库测试是否同步
mysql> select * from teamsun.t1;
+------+----------+
| id | name |
+------+----------+
| 1 | jekinser |
| 1 | tom |
+------+----------+
mysql> insert into teamsun.t1 values(3,'jack');
mysql> insert into teamsun.t1 values(4,'rose');
mysql> insert into teamsun.t1 values(5,'hanghang');
mysql> select * from teamsun.t1;
+------+----------+
| id | name |
+------+----------+
| 1 | jekinser |
| 1 | tom |
| 3 | jack |
| 4 | rose |
| 5 | hanghang |
+------+----------+
从库上测试,两边数据一致
mysql> select * from teamsun.t1;
+------+----------+
| id | name |
+------+----------+
| 1 | jekinser |
| 1 | tom |
| 3 | jack |
| 4 | rose |
| 5 | hanghang |
+------+----------+
5 rows in set (0.00 sec)
5 总结
采用传统方式配置主从复制(M-S)的基本步骤:
1 . 主服务器上打开bin_log 和 server_id,
2 . 给从服务器授权一个账号,拥有 replication slave权限
3 . 备份主服务器mysql所有数据,同时设置 --master-data=1(备份文件中自动指定log_file和log_pos)
4 . 从服务器上测试,授权账号是否可以连接主库
5 . 从服务器 进入MySQL控制台,通过source 方式导入备份文件,使主,从数据库数据一致;
6 . 从服务器通过change master to ,5条语句(master_log_file 和 master_log_pos可以省略)配置主从同步
7 . 从上start slave 启动从服务器上角色
8 . show slave staus 查看 IO SQL线程,确认总从同步是否生效
#注意: 主从复制服务器中,只能在master 上写入数据,slave 上不允许写入数据,一旦写入两边会发生冲突,SQL线程中断,主从复制被破坏。