CentOS下mysql主从同步与读写分离配置
发布时间:2018-12-28 14:52:05
作者:ynkulusi
说明:有两台系统一致的服务器,网络连接正常,能互相PING通,时钟一致
操作系统:CentOS 6.6 64位
MySQL数据库版本:mysql-5.1.73-3.el6_5.x86_6
Master:IP(192.168.1.1)
Slave:IP(192.168.1.2)
准备工作:配置防火墙,开启MySQL默认3306端口
# vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
# /etc/init.d/iptables restart #重启防火墙,使配置生效
关闭SeLinux
# vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
# yum -y install mysql mysql-server #确认主从安装的mysql版本一致
启动mysql
# service mysqld start #启动mysql
# chkconfig mysqld on #开机启动
# mysql_secure_installation #安全强化措施,如设置(非空)的 root 密码、删除匿名用户、锁定远程访问
[root@master ~]# mysql
mysql> show databases; #查看数据库是否一致
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
[root@slave ~]# mysql
mysql> show databases; #查看数据库是否一致
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
2、配置,Master:主机和Slave从机
①.修改Master的配置文件
[root@master ~]# vi /etc/my.cnf #增加以下深黄色内容
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
server-id=1 #本机ID号
log-bin=/var/lib/mysql/mysql-bin.log #二进制日志的存放位置
binlog-do-db=test #需要同步的数据库名,多个数据库重复此参数,每个数据库一行
binlog-ignore-db=mysql #不同步mysql系统数据库
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@master ~]# service mysqld restart #重新启动mysql
[root@master ~]# mysql
mysql> show master status\G; #查看主机状态及相关信息
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 106
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
ERROR:
No query specified
②.锁表并导出、导入初始化主从数据库表信息
mysql> flush tables with read lock; #锁表,限制用户读写及访问导致数据异常
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
[root@master ~]# mysqldump -hlocalhost -uroot -p3306 -p test > /home/test.sql #导出数据库test到/home目录下,命名为test.sql
Enter password:
总用量 4
-rw-r--r-- 1 root root 1260 11月 17 17:37 test.sql
[root@master ~]# scp /home/test.sql root@192.168.1.2:/home/ #把数据库文件传到从机上
root@192.168.1.2's password:
test.sql 100% 1260 1.2KB/s 00:00
[root@master ~]# mysql
mysql> unlock tables; #解锁表
Query OK, 0 rows affected (0.00 sec)
[root@master ~]# mysql
mysql> grant replication slave on *.* to 'slaveuser'@'192.168.1.2' identified by '123456' with grant option; #授权用户slaveuser只能从192.168.1.2这个IP访问主服务器192.168.1.1上面的数据库,并且只具有数据库备份的权限,取消授权类似,把grant换成revoke,to换成from即可。
Query OK, 0 rows affected (0.00 sec) #建立从机用来同步主机数据库的账号
mysql> flush privileges; #刷新授权
Query OK, 0 rows affected (0.00 sec)
mysql> use mysql;
Database changed
mysql> select user,host,password from user;
+-----------+-----------------------+-------------------------------------------+
| user | host | password |
+-----------+-----------------------+-------------------------------------------+
| root | localhost | |
| root | localhost.localdomain | |
| root | 127.0.0.1 | |
| | localhost | |
| | localhost.localdomain | |
| slaveuser | 192.168.1.2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-----------------------+-------------------------------------------+
6 rows in set (0.00 sec)
mysql> show grants for slaveuser@192.168.1.2\G; #查看从机的授权信息
*************************** 1. row ***************************
Grants for slaveuser@192.168.1.2: GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'192.168.1.2 IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
1 row in set (0.00 sec)
ERROR:
No query specified
[root@slave ~]# mysql -h 192.168.1.1 -u slaveuser -p #测试在从机上用同步账号是否能正常登录进主机数据库
④.修改Slave的配置文件
[root@slave ~]#
[root@slave ~]# vi /etc/my.cnf #增加以下深黄色部分内容,青色为老配置,可不用
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
server-id=2 #设置服务器id,修改其值为2,表示为从数据库
log-bin=/var/lib/mysql/mysql-bin.log #启动MySQ二进制日志系统replicate-do-db=test #需要同步的数据库名
replicate-ignore-db=mysql #不同步mysql系统数据库
server-id=2 #从机ID,老配置方式不用执行同步语句
log-bin=/var/lib/mysql/mysql-bin.log #二进制日志的存放位置
relay-log = relay-log #启用中继日志
master-host=192.168.1.1 #主机的IP地址
master-user=slaveuser #连接到主机的用户
master-password=123456 #连接到主机的密码
master-port=3306 #端口
master-connect-retry=60 #端口重连时间60秒
replicate-wild-ignore-table=mysql.% #主从复制时候忽略的数据库
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
注意:MySQL 5.1.7版本之后,已经不支持把master配置属性写入my.cnf配置文件中了,只需要把同步的数据库和要忽略的数据库写入即可。
⑤.在从机上执行同步语句,手动同步相关配置信息
[root@slave ~]# mysql #进入MySQL控制
mysql> slave stop; #停止slave同步进程
mysql> change master to master_host='192.168.1.1',master_user='slaveuser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106; #执行同步语句
mysql> slave start; #开启slave同步进程,或者start slave,停止stop slave
mysql> exit #退出重新启动mysql
[root@slave ~]# service mysqld restart #重新启动mysql
[root@slave ~]# mysql
mysql> show slave status\G; #查看从机状态及相关信息
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.1
Master_User: slaveuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 407
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
ERROR:
No query specified
注意查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上这两个参数的值为Yes,即说明配置成功!
在从机上关闭写功能:
可以编辑my.cnf,在[mysqld]下增加:read-only = on #-或者_都可以,on、yes、true、1同效,然后登陆mysql,show global variables like ‘read_only’;查看,重启不影响同步
3、测试同步效果
[root@master ~]# mysql #登录主机master查看同步数据库表信息
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)
[root@slave ~]# mysql #登录从机slave查看同步数据库表信息
mysql> use test;
操作系统:CentOS 6.6 64位
MySQL数据库版本:mysql-5.1.73-3.el6_5.x86_6
Master:IP(192.168.1.1)
Slave:IP(192.168.1.2)
准备工作:配置防火墙,开启MySQL默认3306端口
# vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
# /etc/init.d/iptables restart #重启防火墙,使配置生效
关闭SeLinux
# vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
1、软件安装
# rpm -qa |grep mysql #检测mysql安装情况,没安装就安装# yum -y install mysql mysql-server #确认主从安装的mysql版本一致
启动mysql
# service mysqld start #启动mysql
# chkconfig mysqld on #开机启动
# mysql_secure_installation #安全强化措施,如设置(非空)的 root 密码、删除匿名用户、锁定远程访问
[root@master ~]# mysql
mysql> show databases; #查看数据库是否一致
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
[root@slave ~]# mysql
mysql> show databases; #查看数据库是否一致
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
2、配置,Master:主机和Slave从机
①.修改Master的配置文件
[root@master ~]# vi /etc/my.cnf #增加以下深黄色内容
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
server-id=1 #本机ID号
log-bin=/var/lib/mysql/mysql-bin.log #二进制日志的存放位置
binlog-do-db=test #需要同步的数据库名,多个数据库重复此参数,每个数据库一行
binlog-ignore-db=mysql #不同步mysql系统数据库
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@master ~]# service mysqld restart #重新启动mysql
[root@master ~]# mysql
mysql> show master status\G; #查看主机状态及相关信息
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 106
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
ERROR:
No query specified
②.锁表并导出、导入初始化主从数据库表信息
mysql> flush tables with read lock; #锁表,限制用户读写及访问导致数据异常
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
[root@master ~]# mysqldump -hlocalhost -uroot -p3306 -p test > /home/test.sql #导出数据库test到/home目录下,命名为test.sql
Enter password:
[root@master ~]# mysqldump -uroot -p test -l -F > /home/test.sql; #效果同上
-F #flush logs, 生成新的日志文件, 包括 bin-log 日志
-l #lock 锁定数据库, 防止在导出的时候被写入数据, 完成后自动解锁
[root@master ~]# ll /home总用量 4
-rw-r--r-- 1 root root 1260 11月 17 17:37 test.sql
[root@master ~]# scp /home/test.sql root@192.168.1.2:/home/ #把数据库文件传到从机上
root@192.168.1.2's password:
test.sql 100% 1260 1.2KB/s 00:00
[root@master ~]# mysql
mysql> unlock tables; #解锁表
Query OK, 0 rows affected (0.00 sec)
[root@slave ~]# mysqldump -uroot -p test -v -f < /home/test.sql;
#在从机上导入主服务器中的数据
-v #查看导入的详细信息
-f #是当中间遇到错误时, 可以 skip 过去, 继续执行下面的语句
当然你也可以用 source 命令导入
[root@slave ~]# mysql
mysql> use test;
mysql> source /home/test.sql;
③.授权同步账号权限[root@master ~]# mysql
mysql> grant replication slave on *.* to 'slaveuser'@'192.168.1.2' identified by '123456' with grant option; #授权用户slaveuser只能从192.168.1.2这个IP访问主服务器192.168.1.1上面的数据库,并且只具有数据库备份的权限,取消授权类似,把grant换成revoke,to换成from即可。
Query OK, 0 rows affected (0.00 sec) #建立从机用来同步主机数据库的账号
mysql> flush privileges; #刷新授权
Query OK, 0 rows affected (0.00 sec)
mysql> use mysql;
Database changed
mysql> select user,host,password from user;
+-----------+-----------------------+-------------------------------------------+
| user | host | password |
+-----------+-----------------------+-------------------------------------------+
| root | localhost | |
| root | localhost.localdomain | |
| root | 127.0.0.1 | |
| | localhost | |
| | localhost.localdomain | |
| slaveuser | 192.168.1.2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+-----------------------+-------------------------------------------+
6 rows in set (0.00 sec)
mysql> show grants for slaveuser@192.168.1.2\G; #查看从机的授权信息
*************************** 1. row ***************************
Grants for slaveuser@192.168.1.2: GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'192.168.1.2 IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
1 row in set (0.00 sec)
ERROR:
No query specified
[root@slave ~]# mysql -h 192.168.1.1 -u slaveuser -p #测试在从机上用同步账号是否能正常登录进主机数据库
④.修改Slave的配置文件
[root@slave ~]#
[root@slave ~]# vi /etc/my.cnf #增加以下深黄色部分内容,青色为老配置,可不用
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
server-id=2 #设置服务器id,修改其值为2,表示为从数据库
log-bin=/var/lib/mysql/mysql-bin.log #启动MySQ二进制日志系统replicate-do-db=test #需要同步的数据库名
replicate-ignore-db=mysql #不同步mysql系统数据库
server-id=2 #从机ID,老配置方式不用执行同步语句
log-bin=/var/lib/mysql/mysql-bin.log #二进制日志的存放位置
relay-log = relay-log #启用中继日志
master-host=192.168.1.1 #主机的IP地址
master-user=slaveuser #连接到主机的用户
master-password=123456 #连接到主机的密码
master-port=3306 #端口
master-connect-retry=60 #端口重连时间60秒
replicate-wild-ignore-table=mysql.% #主从复制时候忽略的数据库
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
注意:MySQL 5.1.7版本之后,已经不支持把master配置属性写入my.cnf配置文件中了,只需要把同步的数据库和要忽略的数据库写入即可。
⑤.在从机上执行同步语句,手动同步相关配置信息
[root@slave ~]# mysql #进入MySQL控制
mysql> slave stop; #停止slave同步进程
mysql> change master to master_host='192.168.1.1',master_user='slaveuser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106; #执行同步语句
mysql> slave start; #开启slave同步进程,或者start slave,停止stop slave
mysql> exit #退出重新启动mysql
[root@slave ~]# service mysqld restart #重新启动mysql
[root@slave ~]# mysql
mysql> show slave status\G; #查看从机状态及相关信息
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.1
Master_User: slaveuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 407
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
ERROR:
No query specified
注意查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上这两个参数的值为Yes,即说明配置成功!
在从机上关闭写功能:
可以编辑my.cnf,在[mysqld]下增加:read-only = on #-或者_都可以,on、yes、true、1同效,然后登陆mysql,show global variables like ‘read_only’;查看,重启不影响同步
3、测试同步效果
[root@master ~]# mysql #登录主机master查看同步数据库表信息
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)
[root@slave ~]# mysql #登录从机slave查看同步数据库表信息
mysql> use test;
分类:mysql
评论数:1
阅读数:1032
-
2018-12-28 15:18:321[root@slave ~]# mysql #登录从机slave查看同步数据库表信息
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)
[root@master ~]# mysql #登录主机master
mysql> create table kulusi(id int not null primary key,name char(20)); #创建一个表
Query OK, 0 rows affected (0.03 sec)
mysql> show tables; #查看表
+----------------+
| Tables_in_test |
+----------------+
| kulusi |
+----------------+
1 row in set (0.00 sec)
mysql> desc kulusi; #查看表结构
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(20) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
[root@slave ~]# mysql #登录从机
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| kulusi |
+----------------+
1 row in set (0.00 sec)
mysql> desc kulusi; #查看表结构
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(20) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
根据测试信息说明,主从同步配置成功。
注意:清除mysql二进制文件只能用命令,不能手动删除
Syntax:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }