基于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;
以上就是冷备恢复的方法,可以看出二进制文件非常重要,所有建议单独存放,不要和数据文件放在一个目录
注意配置文件一定要开起二进制日志记录
文章评论