一,环境
系统:centos 7
版本:mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
master:192.168.10.74
slave:192.168.10.75
二,原理
- (1) Master 将数据改变记录到二进制日志(binary log)中,也就是配置文件 log-bin 指定的文件,这些记录叫做二进制日志事件(binary log events);
- (2) Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log);
- (3) Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)。
- 主库db的更新事件(update、insert、delete)被写到binlog
- 从库发起连接,连接到主库
- 主库创建一个binlog dump thread线程,把binlog的内容发送到从库
- 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
- 还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db.
目的
- 数据同步备份 主库master发生故障后,可以马上切换到从库slave,降低服务风险。
- 读写分离 可以把写操作放在master,读取操作放在slave,减轻单一数据库的操作压力
- 高可用HA
随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能。
基本原理
master记录下自己的操作日志,授权从服务器可以读取操作日志,slave会开启两个线程。
- IO线程 负责连接master
连接成功后,睡眠并等待master产生新的事件,有新的就保存到自己的中继日志中,中继日志通常位于操作系统的缓存中,所以开销很小。 - sql进程 负责执行中继日志中的sql操作,这样slave的内容就和master的一致了。
三,注意
- 1)主从服务器操作系统版本和位数一致;
- (2) Master 和 Slave数据库的版本要一致;
- (3) Master 和 Slave 数据库中的数据要一致;
- (4) Master 开启二进制日志,Master 和 Slave 的 server_id 在局域网内必须唯一;
四,二进制安装MySQL
# tar xf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C
# mkdir /usr/local/msyql
# mv mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz/* /usr/lcoal/mysql
#mkdir /usr/local/mysql/data
添加 mysql 组和 mysql 用户:
# groupadd mysql
# useradd mysql -g mysql
# chown -R msyql.mysql /usr/local/mysql
查看是否存在 mysql 组
# more /etc/roup | grep mysql
查看 msyql 属于哪个组
# groups mysql
检查是否安装了 libaio
# rpm -qa | grep libaio
若没有则安装
# yum search libaio
# yum -y install libaio
初始化 mysqld
进入安装 mysql 软件目录
cd /usr/local/mysql/
# /usr/local/mysql/bin/mysqld --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --initialize
**设置开机启动 **
[root@localhost ~]# cd /usr/local/mysql/
[root@localhost mysql]# cp ./support-files/mysql.server /etc/init.d/mysql
cp: overwrite ‘/etc/init.d/mysql’? y
增加 mysqld 服务控制脚本执行权限:
## chmod +x /etc/init.d/mysql
将 mysqld 服务加入到系统服务
# chkconfig mysql on
检查mysqld服务是否已经生效
chkconfig --list mysql
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
表明mysqld服务已经生效,在2、3、4、5运行级别随系统启动而自动启动,以后可以使用 service 命令控制 mysql 的启动和停止。
查看启动项
查看启动项:
chkconfig --list | grep -i mysql
删除启动项:
chkconfig --del mysql
环境变量配置
将mysql的bin目录加入PATH环境变量,编辑 /etc/bashrc文件:
[root@localhost mysql]# vim /etc/bashrc
MYSQL_HOME=/usr/local/mysql/bin
export PATH=$PATH:${MYSQL_HOME}
执行命令使其生效:
[root@localhost mysql]# source /etc/bashrc
用 export 命令查看PATH值:
[root@localhost mysql]# echo $PATH
配置master
建立配置文件
vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin //[必须]启用二进制日志
server-id=10//[必须]服务器唯一ID,默认是1,一般取IP最后一段
配置完成后需要重启mysqlserver才能生效。
#service mysql restart
创建授权用户
登陆主服务器mysql命令行,创建一个用于从服务器复制的用户。
mysql> GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 429 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
"."表示对所有库的所有操作,“%”表示所有客户端都可能连,也可用具体客户端IP代替,如192.168.10.75,加强安全。
记录master 状态信息
查看二进制日志文件名,及最新位置。让slave知道用哪个用户信息访问master,知道读取哪个日志文件,及从哪儿开始读。
mysql>show master status;
其中file、position字段需要记录下值,mysql-bin.000001 是用于主从复制的文件名,
437是日志文件内的最新位置。
查看一下从服务器的中继日志是否在启动状态:
SHOW GLOBAL VARIABLES LIKE '%relay%'; #
配置slave
修改配置文件my.cnf,使用二进制日志,指定server-id,重新启动服务。
[mysqld]
log_bin=mysql-bin
server-id=11
将slave指向master
登陆从服务器mysql命令行,使用之前创建的用户和master的日志文件及其位置。slave中使用被授权用户信息及日志文件信息,进行指向master。这时已经建立了和master的联系,明确了从哪儿读取日志文件。
change master to master_host='192.168.239.142',master_user='root',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=429;
flush privileges;
//注意不要断开,“437”无单引号。
启动slave
mysql>start slave;
查看slave状态
mysql> show slave status\G;
结果中有两个重要数据项:
- Slave_IO_Running: Yes IO线程状态,必须YES
- Slave_SQL_Running: Yes SQL线程状态,必须YES
常见的问题是SQL线程没有正常工作 Slave_SQL_Running: No。通常是两边的数据库不是完全对应的,需要确保master上的库及到目前为止的最新记录都复制到slave上了。
验证测试
当IO线程和SQL线程都正常后,到master中随意测试下插入、修改、删除操作,同时到slave中
报错
查看日志
#cat /var/log/mysqld.log #/etc/my.cnf里面有日志路径
[ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
问题定位:由于uuid相同,而导致触发此异常
解决方案
把uuid修改即可
# find / -name a^Co.cnf
# vi /usr/local/mysql/data/auto.cnf
#service mysql restart
mysql> start slave;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 4
Current database: *** NONE ***
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show slave status \G;
测试主从同步,同步成功
扩展信息
# 设置 server_id,一般设置为 IP
server_id=131
# 复制过滤:需要备份的数据库,输出 binlog
#binlog-do-db=liuyazhuang
# 复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步)
binlog-ignore-db=mysql
# 开启二进制日志功能,可以随便取,最好有含义
log-bin=lyz-mysql-bin
## 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。
# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062
借鉴:https://blog.csdn.net/l1028386804/article/details/75041540
MySQL备份脚本及异地备份
1.异地备份的话,需要做ssh免密登录
在MySQL服务器上操作
ssh-keygen
ssh-copy-id root@192.168.1.4
2. MySQL全备脚本,可以备份多个数据库,单独文件夹,删除十天前的备份,拷贝到其他服务器(scp增量,不会覆盖掉原先文件)
#!/bin/bash
#Mysql dabase information
#主机
find /aebiz/soft/databackup/* -type f -mtime +10 -name "*.gz" -exec rm {} \;
db_host="localhost"
#数据库帐号
db_user="root"
#数据库密码
db_passwd="123456"
#mysql安装目录
MYSQL="/aebiz/soft/mysql"
#mysql命令目录
MYSQLDUMP="/aebiz/soft/mysql/bin/mysqldump"
#Path information
#存放备份文件的路径
BACKUP_DB="/aebiz/soft/databackup"
LogFile=$BACKUP_DB"/bak.log"
#Time information
#时间
time=`date +"%Y-%m-%d-%H-%M-%S"`
day=`date +"%d"`
month=`date +"%Y-%m"`
weekday=`date +"%u"`
#Path enable write
if [ ! -w "$BACKUP_DB" ]; then
chmod -R 700 $BACKUP_DB
fi
#echo "**********************************host info****************************************"
#echo "db_host:"$db_host
#echo "db_user:"$db_user
#echo "db_passwd:"$db_passwd
#echo "MYSQL:"$MYSQL
#echo "MYSQLDUMP:"$MYSQLDUMP
#echo "databaseName:"$databaseName
#echo "BACKUP_DB:"$BACKUP_DB
#echo "**********************************************************************************"
#Mysql Backup
Date=`date +%Y%m%d`
Begin=`date +"%Y-%m-%d %H:%M:%S"`
#echo "start backup database:"$databaseName" "$Begin
#databases
#需要备份的数据库,如果有多个数据库,请用,分隔
databaseList="ceshishop,ceshiydys,testshop0711,testydys0711"
for databaseName in `echo "$databaseList" | sed 's/,/\n/g'`
do
echo $databaseName
#fileName
#生成备份文件名
fileName=$databaseName"-"$time".sql"
#生成备份文件完整路径
BACKUP_DBPATH=$BACKUP_DB"/"$databaseName
#echo "***********************************database Info***********************************************"
#echo "BACKUP_DBPATH:"$BACKUP_DBPATH
#echo "fileName:"$fileName
#echo "**********************************************************************************"
if [ ! -d "$BACKUP_DBPATH" ]; then
mkdir "$BACKUP_DBPATH"
fi
#备份mysql
$MYSQLDUMP -u $db_user -p$db_passwd -h $db_host $databaseName > $BACKUP_DBPATH/$fileName
#打包.sql文件
cd $BACKUP_DBPATH && tar -czf $fileName.tar.gz $fileName && rm -rf $fileName && chmod go-rwx $fileName.tar.gz
Last=`date +"%Y-%m-%d %H:%M:%S"`
#echo "end backup database:"$databaseName" "$Last
#输出日志
echo start:$Begin end:$Last $fileName succ >> $LogFile
done
#scp -r /aebiz/soft/databackup root@192.168.1.4:/aebiz/soft
3.Mysql服务器设置crontab定时任务
每隔三天的凌晨三点,执行备份
0 3 */3 * * sh /aebiz/soft/databasebak.sh
4.备份服务器设置crontab定时任务
备份服务器的可以设置保留时间长一些,删除30天前的备份
每隔三天查找备份目录下超过三十天的文件并删除.
0 3 */3 * * find /aebiz/soft/databackup/* -type f -mtime +30 -name "*.gz" -exec rm {} \;
MySQL如何不停机维护主从同步
那么在企业里主数据库不停机的情况,如何做到不停机维护主从同步呢?今天我们就跟大家分享一下企业实际案例。
实战环境
Mysql-5.7
Xtrabackup-2.4
Xtrabackup 介绍
Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。
它可以备份来自MySQL5.1,5.5,5.6和5.7服务器上的InnoDB,XtraDB和MyISAM表的数据,以及带有XtraDB的Percona服务器。
XtraBack XtraBackup 工具 up 工具
Xtrabackup 本身只能备份InnoDB和XtraDB,不能备份MyISAM。
innobackupex 封装了xtrabackup的perl脚本,覆盖了Xtrabackup的功能。它不但可以备份nnodb和xtradb两种引擎的表,还可以备份myisam引擎的表(在备份myisam表时需要加一个读锁)。
Xtrabackup特点
备份过程快速、可靠;
备份过程不会打断正在执行的事务;
能够基于压缩等功能节约磁盘空间和流量;
自动实现备份检验;
还原速度快;
Xtrabackup备份实现原理
innobackupex开启xtrabackup_log监控线程,实时监测redolog文件的变化,将新备份过程重新写入到事务日志中的日志拷贝至innobackup_log中;
同时开启xtrabackup拷贝线程,开始拷贝innodb文件,拷贝数据数据结构,记录当前binlog及position完成备份。
全备恢复原理
将全备文件进行xtrabackup_log日志回放,并对提交的事务进行重做,同时rollback未提交的事务。并将全备文件复制到mysql 下的data目录下。
主数据库
1、安装xtrabackup工具
$ yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm$ yum update percona-release$ yum install percona-xtrabackup-24 -y
2、主数据库全量备
# 全量备份$ innobackupex --defaults-file=/etc/my.cnf --user=root --password=magedu /data/backup# 保持事务一致性 apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件处于一致性状态,把已提交的事务合并到ibdata文件$ innobackupex --apply-log /data/backup/2020-03-28_19-13-07
3、 将主数据库备份文件压缩并拷贝到从数据库
$ tar czf backup.tar.gz 2020-03-28_19-13-07$ scp -r /data/backup/backup.tar.gz 172.21.0.8:/data/backup/
4、 主库授权同步帐号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slave_passport';mysql> FLUSH PRIVILEGES;
5、查看主库备份到位置,从库从备份位置开始同步
$ cat /data/backup/2020-03-28_19-13-07/xtrabackup_binlog_infomysql-bin.000001 1053
从数据库操作
1、从数据全量恢复
$ cd /data/backup/ && tar xf backup.tar.gz$ innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /data/backup/2020-03-28_19-13-07
2、修改数据文件权限
$ chown -R mysql:mysql /var/lib/mysql
3、 启动从数据库
$ systemctl restart mysqld
4、查看主数据库第五步主库备份的位置,开始同步
mysql> CHANGE MASTER TO MASTER_HOST='172.21.0.9', \MASTER_USER='slave', \MASTER_PASSWORD='slave_passport', \MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001', \MASTER_LOG_POS=1053;
5、开启主从同步
mysql> start slave;mysql> show slave status\G;# 下面二个Yes代表已经正常同步了Slave_IO_Running=YesSlave_SQL_Running=Yes
总结
Mysql主从同步,双机热备、数据备份技术已经成为运维工程师不可缺少的技术之一了,无论在哪个公司总有在用Mysql的。
https://www.jianshu.com/p/0e55e96d1f08
参考链接:
Linux 系统下安装 mysql5.7.25(glibc版)更多介绍
https://www.cnblogs.com/huxinping8800/p/9719931.html
https://www.cnblogs.com/plutozzl/p/13099065.html
https://blog.csdn.net/qq_42427971/article/details/115704611?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_v2~rank_aggregation-17-115704611.pc_agg_rank_aggregation&utm_term=mysql%E5%BC%80%E5%90%AF%E4%B8%AD%E7%BB%A7%E6%97%A5%E5%BF%97&spm=1000.2123.3001.4430
二进制安装MySQL实现主从复制
https://www.jianshu.com/p/7875e8ffadbd
MySQL备份脚本及异地备份 : https://www.jianshu.com/p/32663e2857cf
Mycat基于主从复制实现读写分离 : https://www.jianshu.com/p/186a98d879c4
Rocket MQ 安装使用 : https://www.jianshu.com/p/9f65ac0dca25
https://blog.csdn.net/weixin_40816738/article/details/100054450