Mysql主从搭建
MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。
实现思路
实现MySQL主从复制需要进行的配置:
主服务器:
开启二进制日志
配置唯一的server-id
获得master二进制日志文件名及位置(Position)
创建一个用于slave和master通信的用户账号
从服务器:
配置唯一的server-id
使用master分配的用户账号读取master二进制日志(执行sql语句)
启用slave服务
一、准备工作
1.主从数据库版本最好一致
2.主从数据库内数据保持一致
主数据库:192.168.1.52 /linux
从数据库:192.168.1.190 /linux
二、主数据库master修改
1.修改mysql配置
修改配置文件/etc/mysql/my.cnf,在[mysqld]部分插入如下两行:
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id
2.重启mysql,创建用于同步的用户账号
打开mysql会话shell>mysql -hlocalhost -uname -ppassword
创建用户并授权:用户:repl密码:123123
grant replication slave on *.* to 'repl'@'192.168.1.52' identified by '123123';
#给用户repl赋予replication权限和ip密码
flush privileges; #重新刷新权限
flush tables with read lock; #表的读锁死
show master status; #读数据状态
3.查看master状态
记录二进制文件名(mysql-bin.000236)和位置(66014):
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000236 | 66014 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.02 sec)
三、从服务器slave修改
1.修改mysql配置
同样修改my.cnf配置文件,添加server-id
[mysqld]server-id=2 #设置server-id,必须唯一
2.重启mysql,打开mysql会话,执行同步SQL语句
(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.52',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='123123',
-> MASTER_LOG_FILE='mysql-bin.000236',
-> MASTER_LOG_POS=66014;
Query OK, 0 rows affected, 2 warnings (0.07 sec)
3.启动slave同步进程:
mysql>start slave;
4.查看slave状态:
mysql> show slave statusG
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.52
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000236
Read_Master_Log_Pos: 106039
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 40308
Relay_Master_Log_File: mysql-bin.000236
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。
接下来就可以进行一些验证了。比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效;还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。
其他参数
还可以用到的其他相关参数:
master开启二进制日志后默认记录所有库所有表的操作,
可以通过配置来指定只记录指定的数据库甚至指定的表的操作,
具体在mysql配置文件的[mysqld]可添加修改如下选项:
# 不同步哪些数据库
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db = game
问题处理
mysql> show slave statusG
.......
Relay_Log_File: localhost-relay-bin.000535
Relay_Log_Pos: 21795072
Relay_Master_Log_File: localhost-bin.000094
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
......
- 解决办法一
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
一般是事务回滚造成的:
解决办法:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
- 解决办法二
首先停掉Slave服务:slave stop
到主服务器上查看主机状态:
记录File和Position对应的值
进入master
mysql> show master status;
然后到slave服务器上执行手动同步:
重新执行change master to语句
也有可能跟我一样,没有执行锁表语句(表的读锁死)
因为不会执行主从复制前的数据,需要自己手动复制(执行sql导入)