mysql的主从配置
主从配置
一、准备工作:
1.主从数据库版本要一致
2.主从数据库内数据要保持一致
主数据库:10.0.22.55 /linux
从数据库:10.0.22.56 /linux
二、主数据库master修改:
1.修改mysql配置
找到主数据库的配置文件my.cnf(或者my.ini),在/etc/mysql/my.cnf,在[mysqld]部分插入如下两行:
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id
2.重启mysql,创建用于同步的用户账号
打开mysql会话shell>mysql -hlocalhost -uname -ppassword
创建用户并授权:用户:cluser 密码:clpass
CREATE USER 'cluser'@'10.0.22.56' IDENTIFIED BY 'clpass'; #创建用户
GRANT REPLICATION SLAVE ON *.* TO 'cluser'@'10.0.22.56'; #分配权限
flush privileges; #刷新权限
3.查看master状态,记录二进制文件名(mysql-bin.000003)和位置(73):
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
二、从服务器slave修改:
1.修改mysql配置
同样找到my.cnf配置文件,添加server-id
[mysqld]
server-id=2 #设置server-id,必须唯一
2.重启mysql,打开mysql会话,执行同步SQL语句(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):
CHANGE MASTER TO
MASTER_HOST='10.0.22.55',
MASTER_USER='cluser',
MASTER_PASSWORD='clpass',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=73;
3.启动slave同步进程:
start slave;
4.查看slave状态:
show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.22.55
Master_User: cluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 11662
Relay_Log_File: mysqld-relay-bin.000022
Relay_Log_Pos: 11765
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
...
当Slave_IO_Running和Slave_SQL_Running都为YES的时候,主从同步配置成功。
验证
在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。
其他相关参数补充:
master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,可在mysql配置文件/etc/mysql/my.cnf中配置。
[mysqld] #可添加修改如下选项:
#不同步哪些数据库
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
#只同步哪些数据库,除此之外,其他不同步
binlog-do-db = game
问题解决
1、Slave_IO_Running状态为Connecting
错误为:IO线程处于正在连接状态
分析:网络、用户、权限
1)查看网络是否互通,端口是否互通。
ping一下IP,telnet一下端口,
参考关闭防火墙命令:systemctl stop firewalld
2)网络无问题后,主节点上查看用户cluser是否存在
select host, user from mysql.user;
+-----------------------+------+
| host | user |
+-----------------------+------+
| % | root |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | |
| localhost | root |
| localhost.localdomain | |
| localhost.localdomain | root |
+-----------------------+------+
7 rows in set (0.03 sec)
不存在,则新建用户重新配置
3)用户存在时,查看用户权限是否正确
show grants for 'user'@'host';
ERROR 1141 (42000): There is no such grant defined for user 'user' on host 'host'
用户无权限,重新赋权(先执行刷新权限试试,是不是分配权限后,忘记刷新了?)。
GRANT REPLICATION SLAVE ON *.* TO 'cluser'@'10.0.22.56'; #分配权限
flush privileges; #刷新权限
2、Slave_SQL_Running状态为No
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE;
start slave;
show slave status\G
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
跳过从主节点接下来的N个事件。这个参数用来修复由SQL语句导致的复制停止。
只有当slave节点的线程没有运行的时候,这个语句才有效。否则,会产生报误。
3、Slave_IO_Running状态为No
查看主服务器上的File ,show master status\G
show master status \G;
*************************** 1. row ***************************
File: master-bin.000004
Position: 120
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql,information_schema
Executed_Gtid_Set:
1 row in set (0.00 sec)
从服务器上查看Master_Log_File, show slave status\G
show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.202.56
Master_User: masterbackup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000024
Read_Master_Log_Pos: 120
Relay_Log_File: slave-relay-bin.000005
Relay_Log_Pos: 284
...
如果Slave_IO_Running状态为No,则很可能是两个值不相同造成的。
取master的file值,在从节点上执行命令:
slave stop;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;
slave start;
mysql读写分离配置
建议:读写分离,给个用户,代码实现,读若干用户,写一个用户
补充链接:基于Atlas的分库分表操作目前还未补充,暂时缺失。