TH小破站

  • 首页
  • 容器
    • 认识Docker
    • DockerFile详解
  • k8s
    • 认识Kubernetes
    • Kubernetes部署--(kubeadm方式)
    • kubeasz部署k8s集群
    • Ansible-binary部署k8s集群-1.31.2
  • Ceph
    • 认识分布式存储
    • CPEH部署
  • CI/CD
    • DevOps认识
    • 部署--Gitlab
  • ELK
    • ELK简介
    • Elasticsearch
    • Kibana部署
    • Logstash
    • ELK--收集 tomcat 日志(实战)
  • HD
    • 认识--大数据
    • Hadoop-单机部署
    • Hadoop-伪分布部署
    • Hadoop-完全分布部署
    • Hadoop-(HA)完全分布部署
    • Ambari自动部署--Hadoop
  • Nginx
    • Nginx功能介绍
    • Nginx安全选项
    • Nginx配置文件简单介绍
    • 网站服务器部署
  • 监控
    • ZABBIX-部署(yum)
    • ZABBIX-编译安装
  • 云计算
    • KVM 概述
    • OpenStack企业级部署(T版)
    • OpenStack之dashboard部署
    • OpenStack-controller的高可用
    • openstack(Caracal版_ubuntu版本)部署
  • 数据库
    • mariadb与mysql
    • mysql主从
    • MySQL--冷备(实战)
    • MySQL--热备(dump表)
    • MySQL--热备(dump库)
    • 数据恢复实战案例
    • Xtrabackup实现MySql8.x全量备份
    • MyCat实现数据库读写分离
    • MHA实现数据库高可用
    • Percona XtraDB(PXC)实现数据库集群高可用
    • 数据库压力测试
    • PostgreSQL 基操
    • PostgreSQL备份恢复
    • PostgreSQL高可用
    • MongDB安装配置基础使用
    • MongoDB实现复制集
    • MongoDB备份还原
  • 自动化
    • ssh远程服务原理及配置
    • Ansible剧本文件应用
    • Ansible管理服务介绍
    • Ansible自动化部署node_exporter(包含升级,回滚)
    • Saltstack-部署安装
  • 脚本
    • 一键查看服务器资源利用率
    • 一键生成SSL证书
    • 保存指定数量的文件/目录
    • 初始化服务器
    • 扫描可用IP
    • 批量分发SSH密钥
    • 监控多主机磁盘脚本
    • 一键安装MySQL8.x脚本
    • Python脚本监控ES集群
    • 资源巡检脚本
    • 查看各用户使用的cpu占比
热衷于分享
架构师成长之路 !!!
  1. 首页
  2. 数据库
  3. 正文

MySQL-冷备(实战)

2023年12月10日 870点热度 0人点赞 0条评论

基于MySQL的冷备

数据库版本mysql-8.0.32

架构

主机名 IP地址 角色
expr01 192.168.139.31 主数据库节点
expr02 192.168.139.32 备用数据库节点
expr03 192.168.139.33 存储节点

1)启动数据库二进制日志重启数据库

`修改配置文件`
[root@expr01 ~]# vim /etc/my.cnf
[mysql]
port = 3306
socket = /apps/mysql/data/mysql.sock
[mysqld]
log-bin = /apps/mysql/logbin/mysql-bin  # 二进制日志开启
port = 3306
mysqlx_port = 33060
mysqlx_socket = /apps/mysql/data/mysqlx.sock
basedir = /apps/mysql
datadir = /apps/mysql/data
socket = /apps/mysql/data/mysql.sock
pid-file = /apps/mysql/data/mysqld.pid
log-error = /apps/mysql/log/error.log
default-authentication-plugin = mysql_native_password
log_timestamps = SYSTEM
`创建目录并修改权限`
[root@expr01 ~]# mkdir /apps/mysql/logbin/ -p
[root@expr01 ~]# chown mysql:mysql /apps/mysql/logbin/
`重启数据库`
[root@expr01 ~]# service mysqld restart
`验证是否生成了二进制日志`
[root@expr01 ~]# ll /apps/mysql/logbin/
total 8
-rw-r----- 1 mysql mysql 157 Dec  9 21:33 mysql-bin.000001
-rw-r----- 1 mysql mysql  36 Dec  9 21:33 mysql-bin.index

2)人为造一些数据

# 创建数据库db1
mysql> create database IF NOT EXISTS db1 CHARACTER SET 'utf8';
# 进入数据db1
mysql> use db1;
# 创建student表并且设置表的初始id为10,指定InnoDB存储引擎,指定utf8字符集
mysql> CREATE TABLE student (
    id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    age tinyint UNSIGNED,
    gender ENUM('M','F') default 'M'
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
# 插入三条数据
mysql> insert student (name,age)values('xiaoming',20);
mysql> insert student (name,age)values('wangwu',21);
mysql> insert student (name,age)values('lisi',18);
# 验证数据
mysql> select * from student;
+----+----------+------+--------+
| id | name     | age  | gender |
+----+----------+------+--------+
| 10 | xiaoming |   20 | M      |
| 11 | wangwu   |   21 | M      |
| 12 | lisi     |   18 | M      |
+----+----------+------+--------+
3 rows in set (0.00 sec)

3)开始进行冷备

3.1)关闭数据库

[root@expr01 ~]# service mysqld stop 

3.2)存储节点主机创建备份目录

[root@expr03 ~]# mkdir /backup

3.3)同步主数据库主机数据到存储节点主机

"# 我是通过rsync(因为可以保留文件数据)进行同步也可以有使用scp(要注意文件属性用户的uid)"
[root@expr01 ~]# yum -y install rsync
[root@expr02 ~]# yum -y install rsync
[root@expr03 ~]# yum -y install rsync
# 拷贝数据到存储节点主机
[root@expr01 ~]# rsync -avz /apps/mysql 192.168.139.33:/backup

3.4)正常启用主数据库模拟在产生一些数据

[root@expr01 ~]# service mysqld start
# 创建数据库db2
mysql> create database IF NOT EXISTS db2 CHARACTER SET 'utf8';
# 进入数据db2
mysql> use db2;
# 创建student2表并且设置表的初始id为1,指定InnoDB存储引擎,指定utf8字符集
mysql> CREATE TABLE student2 (
    id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    age tinyint UNSIGNED,
    gender ENUM('M','F') default 'M'
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 插入一条数据
mysql> insert student2 (name,age)values('wangmaz',31);

3.5)人为损坏主数据库

`删除数据库所有数据`
[root@expr01 ~]# rm -rf /apps/mysql/data/*
`数据库已经无法登录`
[root@expr01 ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/apps/mysql/data/mysql.sock' (2)

3.6)还原数据库数据到备用主机

`# 在备用主机上面安装同版本的mysql,这里我是通过提前写好的脚本安装`
[root@expr02 ~]# ls
anaconda-ks.cfg  install_mysql.sh   mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz
[root@expr02 ~]# bash install_mysql.sh 
`# 验证数据库服务`
[root@expr02 ~]# lsof -i :3306
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  12378 mysql   23u  IPv6  51667      0t0  TCP *:mysql (LISTEN)
`# 停止数据库服务`
[root@expr02 ~]# service mysqld stop 
`# 删除安装自动生成的数据库`
[root@expr02 ~]# rm -rf /apps/mysql
`# 拷贝存储主机的数据到备用主机`
[root@expr03 ~]# rsync -avz /backup/mysql 192.168.139.32:/apps/

3.7)备用主机启动MySQL验证数据

`# 启动备用主机数据库`
[root@expr02 ~]# service mysqld start 
`# 进入数据库验证数据`
[root@expr02 ~]# mysql -uroot -p123456
# 验证数据库db1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
​
# 验证数据库里面表的数据信息
mysql> use db1;
mysql> select * from student;
+----+----------+------+--------+
| id | name     | age  | gender |
+----+----------+------+--------+
| 10 | xiaoming |   20 | M      |
| 11 | wangwu   |   21 | M      |
| 12 | lisi     |   18 | M      |
+----+----------+------+--------+
3 rows in set (0.00 sec)

db1数据库显然没有发生数据丢失,但是db2的数据库我们并没有备份,所有db2的数据丢失了

如果主数据库的二进制文件还在的化我们可以通过二进制文件恢复db2数据库的数据

3.8)通过二进制文件恢复db2数据(前提能获取到主数据库主机的二进制文件)

`# 拷贝最新的二进制文件到存储主机`
[root@expr01 ~]# rsync -avz /apps/mysql/logbin/ 192.168.139.33:/backup/mysql/new-login/
`# 在从存储节点把最新二进制文件拷贝到备用数据库节点`
[root@expr03 ~]# rsync -avz /backup/mysql/new-login 192.168.139.32:/apps/mysql/

3.9)导出二进制日志

[root@expr02 ~]# mysqlbinlog /apps/mysql/new-login/mysql-bin.000002 > login.sql

3.10)基于导出的二进制日志恢复最新数据

# mysql < login.sql # 可以这样恢复但是不建议,因为这样会生成新的二进制,这个二进制我们不需要,建议使用下面方法
`# 进入数据库`
[root@expr02 ~]# mysql -uroot -p123456
# 临时关闭二进制记录
mysql> set sql_log_bin=0;
# 查看是否已经关闭
mysql> show variables like 'sql_log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | OFF   |
+---------------+-------+
# 调用linux命令查看login.sql是否在root目录下面(因为当时导出二进制日志是在root家目录导的)
mysql> system ls /root
anaconda-ks.cfg  install_mysql.sh  login.sql  mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz
# 利用导出的二进制恢复数据
mysql> source /root/login.sql;

3.11)验证最新数据是否恢复

# 查看db2数据库是否恢复
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
# 查看db2数据库的student2表中数据是否恢复
mysql> use db2;
mysql> select * from student2;
+----+---------+------+--------+
| id | name    | age  | gender |
+----+---------+------+--------+
|  1 | wangmaz |   31 | M      |
+----+---------+------+--------+
1 row in set (0.00 sec)
# 打开二进制记录
mysql> set sql_log_bin=1;

以上就是冷备恢复的方法,可以看出二进制文件非常重要,所有建议单独存放,不要和数据文件放在一个目录

注意配置文件一定要开起二进制日志记录

标签: 数据库
最后更新:2023年12月10日

tanghao946

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 基于MySQL的冷备
    • 架构
    • 1)启动数据库二进制日志重启数据库
    • 2)人为造一些数据
    • 3)开始进行冷备

COPYRIGHT © 2025 TH小破站. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2023013789号

渝公网安备50011702500926号