首页 > 数据库 >生产环境故障处理演练-mysql数据库主从恢复

生产环境故障处理演练-mysql数据库主从恢复

时间:2024-08-17 15:15:46浏览次数:5  
标签:-- db 主从 master mysql 服务器 backup 演练

常用命令:

1、查看myqsl当前所有用户:SELECT user, host FROM mysql.user;
2、查看表 mom_tms.t_tms_db_car_base_info 的创建语句:show create table mom_tms.t_tms_db_car_base_info;
3、从库执行查看是否都是只读状态:select @@read_only;
4、查询 MySQL 中 performance_schema 表中 replication_applier_status_by_worker 的所有行数据,以监控和审查复制工作线程的状态:SELECT * FROM performance_schema.replication_applier_status_by_worker\G;
5、停止从服务器:STOP SLAVE;
6、设置下一个 GTID:SET gtid_next = '主库GTID号';
7、开始一个新的事务,但不执行任何操作,然后立即提交:BEGIN;  和  COMMIT;
8、将 GTID 设置为自动模式:SET gtid_next = 'AUTOMATIC';
9、启动从服务器(启动复制进程的命令):START SLAVE;
10、查看超级用户是否是只读(1:只读; 0:关闭只读):select @@super_read_only;
11、查看普通用户是否是只读(1:只读; 0:关闭只读):select @@read_only;
12、关闭只读:set global read_only=0;set global super_read_only=0; 
13、开启只读:set global read_only=1;set global super_read_only=1; 
14、mysql查看所有用户的命令:SELECT user, host FROM mysql.user;
15、MySQL创建一个新的用户:create user '用户名'@localhost IDENTIFIED WITH 'mysql_native_password' BY '密码';
16、给指定的用户授予对所有数据库(*.*)的所有权限:grant all on *.* to '用户名'@localhost;
17、显示从服务器的复制状态信息:show slave status \G;
①Slave_IO_State:显示从服务器 I/O 线程的当前状态。如果复制正常运行,通常应该看到 "Waiting for master to send event"。
②Master_Host 和 Master_Port:主服务器的地址和端口。
③Connect_Retry:从服务器尝试重新连接到主服务器的时间间隔。
④Master_Log_File 和 Read_Master_Log_Pos:从服务器当前读取的二进制日志文件名和位置。
⑤Relay_Log_File 和 Relay_Log_Pos:中继日志文件和位置,表明从服务器已经将主服务器的事件读取到哪里。
⑥Slave_IO_Running 和 Slave_SQL_Running:这两个字段显示 I/O 线程和 SQL 线程是否正在运行,正常情况下应该都是 "Yes"。
⑦Seconds_Behind_Master:表示从服务器在复制上落后主服务器的秒数。如果为 0,则表示从服务器与主服务器同步。
⑧Last_Error:最后发生的错误信息。
⑨Last_SQL_Error:最后发生的 SQL 错误的详细信息。
18、显示主服务器(Master)的二进制日志(Binary Log)的状态信息:show master status\G
①File: 当前主服务器正在写入的二进制日志文件的名称。
②Position: 在当前二进制日志文件中的写入位置。这个位置表示下一个事件将被写入的位置。
③Binlog_Do_DB: 一个可选参数,列出了需要复制的数据库名称。如果为空,则表示复制所有数据库。
19、列出 MySQL 服务器上所有数据库的 SQL 命令:show databases;
④Binlog_Ignore_DB: 一个可选参数,列出了不需要复制的数据库名称。
⑤Executed_Gtid_Set: 列出了所有已执行的全局事务标识符(Global Transaction Identifiers,GTIDs),如果启用了 GTID 模式。
⑥Auto_Position: 如果启用了 GTID 模式,这个值表示从服务器是否使用 GTID 来自动确定复制的位置。
20、配置从服务器以连接到主服务器并开始复制数据的命令:change master to master_host='主库ip',master_port=3306,master_user='repl',master_password='Repl@123',master_auto_position=1;

第一步:排查主从不同步原因
1.查看从库
show slave status \G;
涉及公司数据库参数信息,图片我就不展示了,直接说结论:看参数,Slave_SQL_Running为No;Seconds_Behind_Master为NULL,而不是0和具体延迟数值,说明主从同步断开了。

2.试图抢救下
从库上连续执行 常用命令 里5-9的命令

3.查看从库
show slave status\G;
过程:Slave_SQL_Running:为Yes了,过了几分钟后:Slave_SQL_Running为NO;Seconds_Behind_Master为NULL(说明有问题)

4.从库执行sql
SELECT * FROM performance_schema.replication_applier_status_by_worker\G;

最终结论:根据上述参数信息,和开发核对,确定了是某开发操作不当,用超级用户往从库里导入了数据,所以导致的主从同步断开。

第二步:主库全量备份
1、主库先登录MySQL执行如下,创建一个备份用户
create user '用户名'@localhost IDENTIFIED WITH 'mysql_native_password' BY '密码';
2、赋权
grant all on *.* to 'bakuser'@localhost;
3、主库先安装xtrabackup
yum localinstall -y percona-xtrabackup-80-8.0.14-1.el8.x86_64.rpm
4、备份脚本

#!/bin/bash
ulimit -n 102400
######################################################## 
streammod=xb
keep_days=$1
hostip=当前主库ip
bakdir="/db/backup/mysql"
user=bakuser
password=39xUJQObLvM3KQux!
sock=当前主库mysql.sock路径
backupDir="${bakdir}"
start_time=`date +%y%m%d%H%M%S`
log=/log/${start_time}.log
backup_file=/files/${start_time}.xbstream
## parameters end

#如果没有填keep_days,那就默认设置3天
if [ "${keep_days}" == '' ]; then
  keep_days=3
fi

#备份
function backup() {
case ${streammod} in
###xb
"xb")
  backup_file=${bakdir}/${backup_file}
  xtrabackup --socket=${sock} --user=${user} --password="${password}" --kill-long-queries-timeout=20 --kill-long-query-type=all  --compress --compress-threads=8 --stream=xbstream --backup --target-dir=${bakdir} 1>${backup_file} 2>${bakdir}/${log}
  end_time=`date +%y%m%d%H%M%S`
  echo ${end_time}
  return $?
;;
esac
}

function check_result() {
    end_time=$1
    last_row=`tail -n 1 ${bakdir}/${log}`
    # 1表示备份成功,其余数表示可能备份异常
    backup_file_size=`du -sh ${bakdir}/${backup_file} | awk -F' ' '{print $1}'`
    is_success=`tail -n 1 ${bakdir}/${log} | grep 'completed OK' | wc -l`
    if [ ${is_success} -eq 1 ];then
        backup_result='success'
        delete_backup
    else
        backup_result='fail'
    fi
    mysql_bacup_info="{\"ip\":\"${hostip}\", \"port\":\"3306\", \"backup_tool\":\"${streammod}\", \"start_time\":\"${start_time}\", \"end_time\":\"${end_time}\", \"backup_file_size\":\"${backup_file_size}\", \"backup_file\":\"${backup_file}\", \"backup_dir\":\"${backupDir}\", \"backup_result\":\"${backup_result}\", \"log_last_row\":\"${last_row}\"}"  
    echo $mysql_bacup_info >> $bakdir/log/backup_info.log
}

function delete_backup() {
        find  ${bakdir}/files/  -name '*.xbstream' -mtime +${keep_days} -exec rm {} \;  > /dev/null 2>&1  
        find  ${bakdir}  -name '*.gz' -mtime +${keep_days} -exec rm {} \;  > /dev/null 2>&1  
        find  ${bakdir}/log/  -name '*.log' -mtime +${keep_days} -exec rm {} \;  > /dev/null 2>&1
}

if [ -d ${backupDir} ]; then
        end_time=$(backup)
        wait
        check_result ${end_time}
        if [ $? -gt 80 ]; then
            delete_backup
        fi
else
        mkdir -p ${backupDir}
        chmod 750 ${backupDir}
        end_time=$(backup)
        wait
        check_result ${end_time}
        if [ $? -gt 80 ]; then
            delete_backup
        fi
fi

7、赋权
chmod +x /db/backup/mysql/mysqlbackup.sh
8、执行全备脚本
sh /db/backup/mysql/mysqlbackup.sh
查看脚本生成的日志显示备份成功,此时/db/backup/mysql/files路径下为生成123456.xbstream文件传到从库(文件具体名用12345代称)

第三步:恢复主从
1、在两个从库的123456.xbstream备份文件的当前目录执行如下命令

systemctl stop mysqld
rm -rf /db/mysql/3306/data/*
rm -rf /db/mysql/3306/log/{binlog,relaylog,slowlog,errorlog}
xbstream -x < 240813171655.xbstream  -C /db/mysql/3306/data
xtrabackup --decompress --parallel=4 --target-dir=/db/mysql/3306/data
xtrabackup --prepare --parallel=4 --target-dir=/db/mysql/3306/data
cd /db/mysql/3306/data
mkdir -p /db/mysql/3306/log/{binlog,relaylog,slowlog,errorlog}
chown -R mysql:mysql /db/mysql/3306/
systemctl start mysqld
start slave; 
change master to master_host='主库ip',master_port=3306,master_user='repl',master_password='从连接主的密码',master_auto_position=1;
start slave;
登录从库,执行show slave status\G看看结果

此时可以查看到Slave_SQL_Running参数为yes;Seconds_Behind_Master的参数在下降,到0就说明主从恢复成功

2、开启两个从库所有用户的只读
set global read_only=1;set global super_read_only=1;
这一手是为了防止后续同事的误操作,至于为啥从库不能写数据,因为 一主两从mysql架构 又叫 一写两读

标签:--,db,主从,master,mysql,服务器,backup,演练
From: https://www.cnblogs.com/zhoutuo/p/18364321

相关文章

  • MySQL数据库基础
    目录1.数据库的操作1.1  创建数据库1.2查看数据库1.3选中数据库1.4删除数据库2.常用数据类型2.1数值类型2.2字符串类型2.3日期类型3.表的操作3.1创建表3.2查看所有表3.3查看表的结构3.4删除表4.内容重点总结5.练习1.数据库的操作1.1  ......
  • MySQL数据库入门,pycharm连接数据库—详细讲解
    一.安装MySQL1.常用MySQL5.7,首先安装MySQL,(一) (二)(三)(四)(五)2.配置环境变量打开MySQL安装路径,在其中找到bin文件,复制路径,打开系统高级设置,点击环境变量,在下方找到path,将bin文件路径粘贴其中。3.检验安装是否完成win+r 输入cmd,打开命令提示符,输入指令:netstart|......
  • Ubuntu安装mysql 以及远程连接mysql Windows—适合初学者的讲解(详细)
    目录准备工作一.Xshell中操作(1)在虚拟机中安装mysql(2)连接Windows数据库(3)进入linux数据库。(4)修改mysql配置文件二.Windows命令窗口操作 需要软件虚拟机,Xshell。准备工作1.首先需要打开虚拟机,然后在终端上安装ssh,远程传输协议。安装指令为:sudo apt install......
  • 坑!火山引擎云数据库 MySQL 版节点内存只增不减
    火山引擎云数据库说明文档什么是云数据库MySQL版?云数据库MySQL版是火山引擎基于开源数据库MySQL打造的弹性、可靠的在线关系型数据库服务。MySQL实例使用云原生方式部署,结合本地SSD存储类型,提供高性能读写能力;完全兼容MySQL引擎,并提供实例管理、备份恢复、日志管理......
  • Mysq-造数工具mysql_random_data_load
    1.背景实际开发中,做sql优化,为确保可行性,可能需要模拟出大量数据验证。此处,介绍一个造数工具mysql_random_data_load,体验了下,很方便。2.使用2.1下载下载:mysql_random_data_load(releases页面)选择合适的版本,例如。2.2安装上传到服务器直接解压即可。tar-zxvfmysql_r......
  • 浅看MySQL数据库
    有这么一句话:“一个不会数据库的程序员不是合格的程序员”。有点夸张,但是确是如此。透彻学习数据库是要学习好多知识,需要学的东西也是偏难的。我们今天来看数据库MySQL的一些简单基础东西,跟着小编一起来看一下吧。什么是数据库数据库(Database)是按照数据结构来组织、存储和管......
  • MySQL在Windows和Ubuntu上的安装与远程连接配置指南
    MySQL是一种开源的关系型数据库管理系统,被广泛应用于各种应用程序和网站中。MySQL5.7虽不是MySQL的最新版本,但仍具有许多新功能和改进,提供了更高的性能、安全性和可靠性。本文将详细介绍MySQL5.7,并提供在Ubuntu 22.04上安装、初始化配置和开通远程访问的步骤。在Ubuntu22......
  • 【mysql】mysql安装部署以及用户误删恢复
      本站以分享各种运维经验和运维所需要的技能为主《python零基础入门》:python零基础入门学习《python运维脚本》: python运维脚本实践《shell》:shell学习《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战《k8》从问题中去学习k8s《docker学习》暂未更新......
  • 2024.8.15(python管理mysql、Mycat实现读写分离)
    一、python管理mysql1、搭建主mysql[root@mysql57~]#tar-xfmysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [root@mysql57~]#cp-rmysql-5.7.44-linux-glibc2.12-x86_64/usr/local/mysql[root@mysql57~]#rm-rf/etc/my.cnf[root@mysql57~]#mkdir/usr/local/......
  • python管理MySQL数据库 mysql5.7读写分离 配置mycat(twenty-nine day)
    一、pymysql管理数据库1、搭建主mysql5.7[root@mysql57~]#lsanaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz[root@mysql57~]#tar-xfmysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [root@mysql57~]#lsanaconda-ks.cfgmysql-5.7.44-linux-glibc2......