mysql主从配置(Master-Slave)
默认环境:
一台主,一台从,端口3306设置防火墙例外,两台MySQL安装版本相同,这里使用的是MySQL5.7.34版本。
预先处理,导出需要同步数据库数据:
mysqldump -uroot -p761479629@Lt -B HA > HA.sql
其中-B表示包含数据库创建语句以及其他创建语句。
主配置:
1、修改my.cnf配置
必须配置
server-id=1
log_bin=mysql-bin-master
可选配置(选择同步与不同步的数据库)
#选择需要同步的数据库为HA,不加以下这条默认全部数据库同步。
binlog-do-db=student
#选择不同步数据库,建议设置(避免同步导致登录链接数据库账号混乱)
binlog-ignore-db=mysql
binlog_ignore_db=information_schema
2、创建同步账户
#创建一个名为tongbu的账号用于远程连接数据库进行同步
grant replication slave on *.* to 'tongbu'@'%' identified by '761479629Lt';
flush privileges;
提示弱密码处理方法:(重启MySQL后失效)
set global validate_password_policy=0;
set global validate_password_length=4;
*可选*关闭安全策略
5.7以上版本 关闭密码安全策略插件:在my.cnf添加 validate-password=off 重启mysql。
3、重启MySQL,查看主服务器当前二进制日志名和偏移量
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin-master.000001 | 4406 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.04 sec)
可选操作:
暂时关闭同步命令:
set sql_log_bin=off;
查看二进制log-bin事件
mysql> show binlog events\G;
从配置:
0、导入需要同步的数据库(由于导出时加了 -B,SQL文件包含数据库创建语句以及其他创建语句)
mysql -uroot -p761479629@Lt < HA.sql
1、修改my.cnf配置
必须配置
server-id=2
2、测试同步账号是否能登录
mysql -utongbu -p761479629Lt -h 192.168.3.63
3、命令设置同步参数
change master to master_host='192.168.3.63',master_user='tongbu',master_password='761479629Lt',master_log_file='mysql-bin-master.000001',master_log_pos=4406;
4、启动slave进程,查看同步状态
网上有些使用slave start; 会报错提示有语法错误,请更换使用 start slave;
mysql> slave start;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slave start' at line 1
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
查看同步状态:
show slave status\G;
确保这两项正常:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4、数据库测试,写几条数据测试下,能同步就可以了
==========================================================================
同步主库已有数据到从库
主库操作:
1、停止主库的数据更新操作
mysql>flush tables with read lock;
2、新开终端,生成主数据库的备份(导出数据库)
[root@zhoujietest ~]# mysqldump -uroot -proot student > student.sql
3、将备份文件传到从库
[root@zhoujietest ~]# scp student.sql [email protected]:/root/
4、主库解锁
mysql>unlock tables;
从库操作:
1、停止从库slave
mysql>stop slave;
2、新建数据库student
mysql> create database student default charset utf8;
3、导入数据
[root@ops-dev ~]# mysql -uroot -proot student<student.sql
4、查看从库已有该数据库和数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|student |
| mysql |
| performance_schema |
| test |
+--------------------+
==============================================================================
排错思路:
Slave_IO_Running :一个负责与主机的io通信
Slave_SQL_Running:负责自己的slave mysql进程
如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。
在主服务器上看二进制日志事件列表
mysql> show binlog events \G
从服务器执行MySQL命令下:
mysql> stop slave; #先停止slave服务
mysql> change master to master_log_file='mysql-bin-master.000001',master_log_pos=1164;
#根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果
排错思路:
1、二进制日志没有开启
2、IPTABLES 没有放开端口
3、对应的主机 IP地址写错了
SQL线程出错
1、主从服务器数据库结构不统一
出错后,数据少,可以手动解决创建插入,再更新slave状态。
注:如果主上误删除了。那么从上也就误删除了。 #因此主上要定期做mysqldump备份。