首页 > 数据库 >MySQL数据库备份与恢复

MySQL数据库备份与恢复

时间:2023-03-24 22:34:42浏览次数:56  
标签:hellodb data 备份 sql mysql MySQL root 数据库

一,备份,恢复 为什么要备份 灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景 参考链接: https://www.toutiao.com/a6939518201961251359/
 环境: (重点1.4和二)

IP 角色 MySQL版本
192.168.26.101 源库 8.0.28
  • 1.1备份指定库的表                                                                                                       
复制代码
[root@mysql ~]# mysql -uroot -p123 < hellodb_innodb.sql              首先将文件导入本地,此命令将文件导入数据库 (在ySQL官网下载hellodb_innodb.sql 文件里面含有7个表)
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql ~]# mysql -uroot -p123
 
mysql> show databases;       ## 查看数据库
hellodb                      ## 刚刚导入的
mysql> show tables;          ##查看表
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |9
| teachers          |
| toc               |
+-------------------+
[root@mysql ~]# mysqldump -uroot hellodb -p > /data/hellodb.sql       ##将hellodb库中的表重定向到本地/data下的 hellodb.sql
Enter password:
[root@mysql ~]# ls /data/hellodb.sql
/data/hellodb.sql
[root@mysql ~]#  grep -i create /data/hellodb.sql                      ##查看文件的内容
 
复制代码

 

删库模拟 复制代码
[root@mysql ~]# mysql -uroot -p123
mysql> drop database hellodb;                                      ##进入数据库把hellodb库删除
[root@mysql ~]# mysql -uroot -p123
mysql> create database hellodb2;                                   ##手动创建数据库,导入数据测试
[root@mysql ~]# mysql -uroot -p hellodb2 < /data/hellodb.sql       ##将本地/data下的 hellodb.sql重定向到hellodb2中
Enter password:
[root@mysql ~]# mysql -uroot -p123 
mysql> use hellodb2;
mysql> show tables;  
+-------------------+
| Tables_in_hellodb2 |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |9
| teachers          |
| toc               |
+-------------------+
复制代码

 

  • 1.2备份指定库
复制代码
使用 mysqldump
[root@mysql ~]#  mysql -uroot -p < hellodb_innodb.sql                    ##将hellodb_innodb.sql导入数据库中
Enter password:
[root@mysql ~]# mysqldump -uroot -p -B hellodb > /data/hellodb_B.sql     ##将hellodb库重定向到/data/hellodb_B.sql 
Enter password:
[root@mysql ~]# grep -i 'create' /data/hellodb_B.sql
复制代码 删除数据库
[root@mysql ~]# mysql -uroot -p -e 'drop database hellodb'        ##删除hellodb库
Enter password:
[root@mysql ~]# mysql -uroot -p -e 'show databases'
Enter password:

 还原

[root@mysql ~]# mysql -uroot -p < /data/hellodb_B.sql         ##把/data/hellodb_B.sql导入到数据库中恢复
Enter password:
[root@mysql ~]# mysql -uroot -p -e 'show databases'
Enter password:
 

 


  • 1.3备份所有库
[root@mysql ~]# mysqldump -uroot -p -A > /data/all.sql         ##将MySQL库所有文件重定向到/data/all.sql 
Enter password:
[root@mysql ~]#  grep -i '^create database' /data/all.sql

 模拟数据库损坏,还原

复制代码
[root@mysql opt]# systemctl stop mysqld       
[root@mysql opt]#  rm -rf /usr/local/mysql/*                         损坏MySQL数据库文件(
[root@mysql opt]#  systemctl start mysqld
[root@mysql opt]# mysql -uroot -p123                                删除太彻底了,把mysql删了进不去)   只需要把那五个库删了就行了 
-bash: mysql: command not found
复制代码

 恢复

[root@mysql opt]# scp /data/all.sql [email protected]:/data/all.sql     将备份的文件远程传输到另一台机器进行恢复 相同环境
[root@102 data]#  mysql -uroot -p < /data/all.sql    
#在第一次还原的时候会失败,因为此刻数据库的密码也回到了刚安装完毕后的初始密码,需要首先进去,设置 下root的密码,然后再次进行还原

 

查看结果 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| hellodb            |
| hellodb2           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
| xkf                |
| zabbix             |
+--------------------+
11 rows in set (0.00 sec)
复制代码

 

   
  • 1.4案例四:之前的案例,是只能还原部分数据,如果备份后,到当前的某个时刻,数据没有备份,那么这 部分数据就会丢失,
  #binlog 就是binary log,二进制日志文件,这个文件记录了mysql所有的dml操作。通过binlog日志我 们可以做数据恢复,做备份和主从复制等等 #查看当前binlog状态  复制代码
mysql> select @@log_bin;
+-----------+
| @@log_bin |
+-----------+
|         1 |                       ##以前版本是0,需要打开。现在版本默认打开
+-----------+
1 row in set (0.00 sec)
root@mysql]# vim /etc/my.cnf
[mysqld]
 log-bin=/data/logbin/mysql-bin     把mysql刚生成的二进制文件存放在/data/logbin 
 server-id=1234                                   这两行添加到【mysql】下面
[root@mysql ]# mkdir /data/logbin/
[root@mysql ]# chown mysql.mysql /data/logbin/      改变所属组和用户
[root@mysql ]# systemctl restart mysqld 
[root@mysql ]# mysql -uroot -p
Enter password:
mysql>  show variables like '%format%';
+---------------------------------+---------+
| Variable_name                   | Value   |
+---------------------------------+---------+
| binlog_format                   | ROW     |
| default_week_format             | 0       |
| information_schema_stats_expiry | 86400   |
| innodb_default_row_format       | dynamic |
| require_row_format              | OFF     |
+---------------------------------+---------+
 
##备注,如果这里的 binlog_format格式不是row,建议到配置文件中修改下,在配置文件中mysqld下面 加入binlog_format=row
复制代码

 

#测试,备份 复制代码
[root@mysql ~]# mysqldump -uroot -p -A --master-data=2 > /data/all.sql     -A 全部 --ma单机操作
Enter password:
[root@mysql ~]# mysql -uroot -p hellodb
 
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | xiaoming      |  20 | M      |
|   6 | xiaozhang     |  18 | F      |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec)
 
mysql> insert teachers values(null,'xkf',22,'M');
Query OK, 1 row affected (0.00 sec)                                            #插入新的内容   
 
mysql> insert teachers values(null,'wss',22,'F');
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+             
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | xiaoming      |  20 | M      |
|   6 | xiaozhang     |  18 | F      |
|   7 | xkf           |  22 | M      |
|   8 | wss           |  22 | F      |
+-----+---------------+-----+--------+
8 rows in set (0.00 sec)
 
#查看,已经生成了二进制文件
root@mysql ~]# ll /data/logbin/                                            
total 8
-rw-r-----. 1 mysql mysql 757 Mar 15 19:02 mysql-bin.000001
-rw-r-----. 1 mysql mysql  30 Mar 15 19:00 mysql-bin.index
#查看二进制目前的状态
mysql> show master logs;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 |       757 | No        |
+------------------+-----------+-----------+
1 row in set (0.00 sec)
#打开刚才备份的all.sql文件查看
[root@mysql ~]# vim /data/all.sql
 
 
-- Position to start replication or point-in-time recovery from
--
 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=157;
#这个是当时我们做备份的时候,那个瞬间二进制日志的位置,意思就是备份到了157这个位置,往后的都是没 有备份的
复制代码

 #删除库,还原测试

复制代码
[root@mysql ~]# systemctl stop mysqld.service                    ##要关闭MySQL
[root@mysql ~]# rm -rf /data/3306/data/*                         ##损坏库文件 (删除数据库文件即可)损坏太多了
[root@mysql ~]# ll /data/
total 1220
drwxr-xr-x. 3 mysql mysql      18 Mar  9 14:28 3306
-rw-r--r--. 1 root  root  1249125 Mar 15 19:01 all.sql
drwxr-xr-x. 2 mysql mysql      77 Mar 15 19:39 logbin
[root@mysql logbin]#  mysqlbinlog --start-position=157 /data/logbin/mysql-bin.000001 > /opt/binlog.sql
[root@mysql opt]# ll /opt/     备份完之后没有备份的,通过二进制日志,将未备份的一直到现在最新位置导出来
total 8
-rw-r--r--. 1 root root 4268 Mar 15 19:55 binlog.sql 之前备份和二进制备份都在这两个文件里
[root@mysql opt]# ll /data/
total 1220
drwxr-xr-x. 3 mysql mysql      18 Mar  9 14:28 3306
-rw-r--r--. 1 root  root  1249125 Mar 15 19:01 all.sql
drwxr-xr-x. 2 mysql mysql      77 Mar 15 19:39 logbin
[root@mysql opt]# scp /data/all.sql [email protected]:/root                    将备份的文件远程传输到相同环境配置的102进行恢复
[root@mysql opt]# scp /opt/binlog.sql  [email protected]:/root
进102MySQL
#先暂时停止二进制日志的记录
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
 
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
|             0 |
+---------------+
1 row in set (0.00 sec)
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zabbix             |
+--------------------+
5 rows in set (0.00 sec)
 
#继续还原 
mysql> source /root/all.sql                      利用之前备份的文件和二进制实时备份文件进行恢复
mysql> source /root/binlog.sql
 
#打开二进制
mysql> set sql_log_bin=1;
 
#查看数据是否还原成功
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db2                |
| hellodb            |
| information_schema |                                            备份的数据库文件
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
| zabbix             |
+--------------------+
9 rows in set (0.00 sec)
mysql> use hellodb;
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | xiaoming      |  20 | M      |                   备份完之后没有备份的,通过二进制日志,将未备份的一直到现在最新位置导出来
|   6 | xiaozhang     |  18 | F      |
   7 | xkf           |  22 | M      |
|   8 | wss           |  22 | F      |
+-----+---------------+-----+--------+
8 rows in set (0.00 sec)
 
第一次做完全备份,需要知道完全备份到哪个位置,二进制日志文件(vim /data/all.sql)157),postion all.sql备份到哪里
之后操作是没有备份的,通过二进制日志,将未备份的一直到现在最新位置导出来ejz
二进制文件和数据库文件需要单独存放
 
复制代码

 

  二 mysqldump 备份还原实战案例
  • 2.1 实战案例:恢复误删除的表
  案例说明
每天2:30做完全备份,早上13:47误删除了表students,13:52才发现故障,现需要将数 据库还原到13:47的状态,且恢复被删除的students表        (101恢复到快照二进制MySQL)

 

复制代码
[root@mysql data]#  vim /etc/my.cnf
log-bin=/data/logbin/mysql-bin
[root@mysql ~]# mkdir /data/logbin/
[root@mysql ~]# chown mysql.mysql /data/logbin/
[root@mysql ~]# systemctl restart mysqld
[root@mysql logbin]# mysql -uroot -p123
mysql>  select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)
 
复制代码

 


#完全备份 复制代码
[root@mysql ~]#  mkdir /backup
[root@mysql ~]# rz -E
rz waiting to receive.
[root@mysql ~]# ls
\  anaconda-ks.cfg  hellodb_innodb.sql
[root@mysql ~]# mysql -uroot -p123
mysql> source /root/hellodb_innodb.sql          ##在数据库中把本地hellodb导入进来
[root@mysql ~]# mysqldump -uroot -p -A -F --single-transaction --master-data=2 >/backup/allbackup_`date +%F_%T`.sql
Enter password:                                                                                       日期 时间
                                    -A, --all-databases #备份所有数据库   
                                    single-transaction) -F, --flush-logs #备份前滚动日志,                                                                                                                               
                                    --master-data[=#]: #此选项须启用二进制日志
[root@mysql ~]# ls /backup/
allbackup_2023-03-17_13\:44\:29.sql
复制代码

 

#完全备份后数据更新 复制代码
mysql> use hellodb;
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| students          |
| teachers          |
| toc               |
+-------------------+
mysql> insert teachers values(null,'xiaoming',20,'M');
Query OK, 1 row affected (0.01 sec)
 
mysql> insert teachers values(null,'xiaohua',18,'F');
Query OK, 1 row affected (0.00 sec)
#13:47误删除了一个重要的表
mysql>  drop table teachers;
Query OK, 0 rows affected (0.01 sec)
#后续其它表继续更新
mysql>  insert students (name,age,gender)values('zz',30,'M');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert students (name,age,gender)values('m',29,'F');
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from students;
| 26 | zz | 30 | M | NULL | NULL | 
| 27 | m | 29 | F | NULL | NULL |
复制代码

 

#13:52发现表删除,进行还原 #停止数据库访问  复制代码
#从完全备份中,找到二进制位置
root@mysql ~]# grep '\-\- CHANGE MASTER TO' /backup/allbackup_2023-03-17_13\:44\:29.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=157;
#备份从完全备份后的二进制日志
[root@mysql ~]# mysqlbinlog --start-position=157 /data/logbin/mysql-bin.000002 > /backup/inc.sql
将完全备份后的文件导出到/backup/inc.sql里(完全备份只备份到157,157之后的二进制操作记录需要导出,和之前的完全备份文件配合进行全部还原)
#找到误删除的语句,从备份中删除此语句
[root@mysql ~]# vim /backup/inc.sql
#DROP TABLE `teachers` /* generated by server */    注释掉,让它失效。
如果文件过大,可以使用sed实现 
#sed -i.bak '/^DROP TABLE/d' /backup/inc.sql
mysql> set sql_log_bin=0;   先关闭二进制记录
mysql> source /backup/allbackup_2023-03-17_13:44:29.sql  将之前完全备份的文件重定向到数据库进行恢复
teachers表和student表(删除teachers表需要进 /backup/inc.sql 把误删除的语句注释掉不生效,才可以通过all.....文件恢复)
mysql> set sql_log_bin=1;     数据已经还原打开二进制日志记录验证 
mysql> use hellodb;
mysql>  select * from students;   
|    26 | zz            |  30 | M      |    NULL |      NULL |
|    27 | m             |  29 | F      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
27 rows in set (0.00 sec)
ysql>  select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | xiaoming      |  20 | M      |
|   6 | xiaohua       |  18 | F      |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec)
结果:数据已还原

标签:hellodb,data,备份,sql,mysql,MySQL,root,数据库
From: https://www.cnblogs.com/Xkf-IE/p/17253542.html

相关文章