MySQL特殊恢复实战-第二讲:各种文件丢失,如何救库

##

MySQL特殊恢复实战-第二讲:各种文件丢失,如何救库


澄清:关于兼职,有很多朋友留言。这里做个澄清,我不需要很多人(比如O,最多两个人,如果这两个人都有事,我才会找其他人,所以如果没有合作,那你可以自己找找其他兼职或者私活),说实话,长期稳定的合作关系是重点,我也不想这次找这个人,下次找那个人,沟通和信任成本比较高,望见谅。

这个文章来源于我1x年的时候,面试某备份外企,当时原问题是讲解Oracle的启动过程,众所周知,O的启动过程比较复杂,且需要一些文件(已经不玩O好多年了,记不住了,欢迎吐槽并补充,别问为啥是1X年,我都记不住我哪年没在公司上班了)。

现在主要处理MySQL和PostgreSQL的事,所以我们来看MySQL丢了哪些文件会对启动有何影响以及如何拯救。

1、准备测试库和环境

这里不需要很复杂的测试环境,sakila db就可以了,然后正常关闭数据。安装方式也是repo/YUM安装。

[root@centos ~]# unzip sakila-db.zip
Archive:  sakila-db.zip
   creating: sakila-db/
  inflating: sakila-db/sakila-data.sql
  inflating: sakila-db/sakila-schema.sql
  inflating: sakila-db/sakila.mwb
[root@centos ~]# mysql < sakila-db/sakila-schema.sql
[root@centos ~]# mysql < sakila-db/sakila-data.sql
[root@centos ~]# systemctl stop mysqld

检查状态

[root@centos ~]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Wed 2024-03-06 21:06:19 CST; 2min 7s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 1927 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 1898 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 1927 (code=exited, status=0/SUCCESS)
   Status: "Server shutdown complete"

Mar 06 21:05:51 centos systemd[1]: Starting MySQL Server...
Mar 06 21:05:53 centos systemd[1]: Started MySQL Server.
Mar 06 21:06:18 centos systemd[1]: Stopping MySQL Server...
Mar 06 21:06:19 centos systemd[1]: Stopped MySQL Server.

2、查看MySQL的文件

2.1、实例的文件

[root@centos ~]# ls -lsa /var/lib/mysql
total 81668
    4 drwxr-x--x   8 mysql mysql     4096 Mar  6 21:06 .
    4 drwxr-xr-x. 64 root  root      4096 Mar  6 20:59 ..
    4 -rw-r-----   1 mysql mysql       56 Mar  6 20:59 auto.cnf
    4 -rw-r-----   1 mysql mysql      667 Mar  6 21:01 binlog.000001
    4 -rw-r-----   1 mysql mysql      180 Mar  6 21:04 binlog.000002
 1332 -rw-r-----   1 mysql mysql  1360592 Mar  6 21:06 binlog.000003
    4 -rw-r-----   1 mysql mysql       48 Mar  6 21:05 binlog.index
    4 -rw-------   1 mysql mysql     1680 Mar  6 20:59 ca-key.pem
    4 -rw-r--r--   1 mysql mysql     1112 Mar  6 20:59 ca.pem
    4 -rw-r--r--   1 mysql mysql     1112 Mar  6 20:59 client-cert.pem
    4 -rw-------   1 mysql mysql     1680 Mar  6 20:59 client-key.pem
  192 -rw-r-----   1 mysql mysql   196608 Mar  6 21:06 #ib_16384_0.dblwr
 8384 -rw-r-----   1 mysql mysql  8585216 Mar  6 20:59 #ib_16384_1.dblwr
    4 -rw-r-----   1 mysql mysql     2455 Mar  6 21:06 ib_buffer_pool
12288 -rw-r-----   1 mysql mysql 12582912 Mar  6 21:06 ibdata1
    4 drwxr-x---   2 mysql mysql     4096 Mar  6 21:06 #innodb_redo
    0 drwxr-x---   2 mysql mysql        6 Mar  6 21:06 #innodb_temp
    0 drwxr-x---   2 mysql mysql      143 Mar  6 20:59 mysql
26624 -rw-r-----   1 mysql mysql 27262976 Mar  6 21:06 mysql.ibd
   12 drwxr-x---   2 mysql mysql     8192 Mar  6 20:59 performance_schema
    4 -rw-------   1 mysql mysql     1680 Mar  6 20:59 private_key.pem
    4 -rw-r--r--   1 mysql mysql      452 Mar  6 20:59 public_key.pem
    4 drwxr-x---   2 mysql mysql     4096 Mar  6 21:06 sakila
    4 -rw-r--r--   1 mysql mysql     1112 Mar  6 20:59 server-cert.pem
    4 -rw-------   1 mysql mysql     1680 Mar  6 20:59 server-key.pem
    0 drwxr-x---   2 mysql mysql       28 Mar  6 20:59 sys
16384 -rw-r-----   1 mysql mysql 16777216 Mar  6 21:06 undo_001
16384 -rw-r-----   1 mysql mysql 16777216 Mar  6 21:06 undo_002

2.2、数据库的文件

[root@centos ~]# ls -lsa /var/lib/mysql/sakila/
total 24792
    4 drwxr-x--- 2 mysql mysql     4096 Mar  6 21:06 .
    4 drwxr-x--x 8 mysql mysql     4096 Mar  6 21:06 ..
  128 -rw-r----- 1 mysql mysql   131072 Mar  6 21:06 actor.ibd
  256 -rw-r----- 1 mysql mysql   262144 Mar  6 21:06 address.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 category.ibd
  144 -rw-r----- 1 mysql mysql   147456 Mar  6 21:06 city.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 country.ibd
  208 -rw-r----- 1 mysql mysql   212992 Mar  6 21:06 customer.ibd
  352 -rw-r----- 1 mysql mysql   360448 Mar  6 21:06 film_actor.ibd
  160 -rw-r----- 1 mysql mysql   163840 Mar  6 21:06 film_category.ibd
  352 -rw-r----- 1 mysql mysql   360448 Mar  6 21:06 film.ibd
  272 -rw-r----- 1 mysql mysql   278528 Mar  6 21:06 film_text.ibd
  208 -rw-r----- 1 mysql mysql   212992 Mar  6 21:06 fts_0000000000000431_00000000000000b6_index_1.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_00000000000000b6_index_2.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_00000000000000b6_index_3.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_00000000000000b6_index_4.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_00000000000000b6_index_5.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_00000000000000b6_index_6.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_being_deleted_cache.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_being_deleted.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_config.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_deleted_cache.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 fts_0000000000000431_deleted.ibd
  448 -rw-r----- 1 mysql mysql   458752 Mar  6 21:06 inventory.ibd
  112 -rw-r----- 1 mysql mysql   114688 Mar  6 21:06 language.ibd
10240 -rw-r----- 1 mysql mysql 10485760 Mar  6 21:06 payment.ibd
10240 -rw-r----- 1 mysql mysql 10485760 Mar  6 21:06 rental.ibd
  176 -rw-r----- 1 mysql mysql   180224 Mar  6 21:06 staff.ibd
  144 -rw-r----- 1 mysql mysql   147456 Mar  6 21:06 store.ibd

数据库文件的分析,我们下一期再讲,超出篇幅了。

3、测试开始

如何对数据文件分类,可以查看官网。我们直接看演示

3.1、auto.cnf

[root@centos ~]# mkdir -p /mysql/backup
[root@centos ~]# mv /var/lib/mysql/auto.cnf /mysql/backup/
[root@centos ~]# systemctl start mysqld

[root@centos ~]# ls -lsa /var/lib/mysql/auto.cnf
4 -rw-r----- 1 mysql mysql 56 Mar  6 21:14 /var/lib/mysql/auto.cnf

[root@centos ~]# mysql sakila -e 'select * from actor limit 1'
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|        1 | PENELOPE   | GUINESS   | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+

测试结果,数据库实例再次生成了auto.cnf,能成功启动数据库,并且不影响数据访问

3.2、binlog日志文件

这里是日志文件,不删binlog索引文件

[root@centos ~]# mv /var/lib/mysql/binlog.0* /mysql/backup/

[root@centos ~]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

[root@centos ~]# tail -100f /var/log/mysqld.log

错误日志信息

mysqld: File './binlog.000004' not found (OS errno 2 - No such file or directory)
2024-03-06T13:17:44.5251100 [ERROR] [MY-010958] [Server] Could not open log file.
2024-03-06T13:17:44.5251310 [ERROR] [MY-010041] [Server] Can't init tc log
2024-03-06T13:17:44.525153Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-03-06T13:17:46.028491Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.36)  MySQL Community Server - GPL.
^C

如何解决呢?我这里是mv操作,你可以cp回去,然后改权限,就可以成功启动数据库了。

[root@centos ~]# cp /mysql/backup/binlog.00000* /var/lib/mysql/

[root@centos ~]# chown -R mysql:mysql /var/lib/mysql/binlog.0*
[root@centos ~]# systemctl start mysqld

[root@centos ~]# mysql sakila -e 'select * from actor limit 1'
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|        1 | PENELOPE   | GUINESS   | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+

如果是删了binlog日志文件呢?接着看

3.3、binlog索引文件

[root@centos ~]# mv /var/lib/mysql/binlog.index /mysql/backup/

[root@centos ~]# systemctl start mysqld
[root@centos ~]# tail -100f /var/log/mysqld.log

日志无异常,数据库正常启动。但是binlog索引文件已经有了新的内容。

[root@centos ~]# cat /var/lib/mysql/binlog.index
./binlog.000006

思考题:可以把旧的日志文件信息写到这个文件吗?结果会怎么样?

3.4、*.pem文件

这里所有的*.pem文件一起移除

[root@centos ~]# mv /var/lib/mysql/*.pem /mysql/backup/

[root@centos ~]# systemctl start mysqld

[root@centos ~]# ls -lsa /var/lib/mysql/*.pem
4 -rw------- 1 mysql mysql 1680 Mar  6 21:29 /var/lib/mysql/ca-key.pem
4 -rw-r--r-- 1 mysql mysql 1112 Mar  6 21:29 /var/lib/mysql/ca.pem
4 -rw-r--r-- 1 mysql mysql 1112 Mar  6 21:29 /var/lib/mysql/client-cert.pem
4 -rw------- 1 mysql mysql 1676 Mar  6 21:29 /var/lib/mysql/client-key.pem
4 -rw------- 1 mysql mysql 1676 Mar  6 21:29 /var/lib/mysql/private_key.pem
4 -rw-r--r-- 1 mysql mysql  452 Mar  6 21:29 /var/lib/mysql/public_key.pem
4 -rw-r--r-- 1 mysql mysql 1112 Mar  6 21:29 /var/lib/mysql/server-cert.pem
4 -rw------- 1 mysql mysql 1676 Mar  6 21:29 /var/lib/mysql/server-key.pem

数据库正常启动,再次生成新的文件。

思考题:如何手动生成这些pem文件呢?

3.5、Doublewrite文件

[root@centos ~]# mv /var/lib/mysql/*.dblwr /mysql/backup/

[root@centos ~]# systemctl start mysqld

[root@centos ~]# ls -lsa /var/lib/mysql/*.dblwr
  192 -rw-r----- 1 mysql mysql  196608 Mar  6 22:56 /var/lib/mysql/#ib_16384_0.dblwr
16320 -rw-r----- 1 mysql mysql 8585216 Mar  6 22:56 /var/lib/mysql/#ib_16384_1.dblwr

数据库正常启动,再次生成新的文件。提问:这里如果是在线删除,会丢数据吗?为什么?这似乎也是一个不错的面试题

3.6、redo文件

文件目录#innodb_redo,

[root@centos ~]# mv /var/lib/mysql/#innodb_redo /mysql/backup/

启动失败

[root@centos ~]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

检查日志

[root@centos ~]# tail -100f /var/log/mysqld.log
2024-03-06T14:59:05.0849471 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-03-06T14:59:05.1266131 [ERROR] [MY-013862] [InnoDB] Neither found #innodb_redo subdirectory, nor ib_logfile* files in ./
2024-03-06T14:59:05.1266671 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2024-03-06T14:59:05.6123051 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2024-03-06T14:59:05.6128920 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2024-03-06T14:59:05.6129560 [ERROR] [MY-010119] [Server] Aborting
2024-03-06T14:59:05.6150890 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.36)  MySQL Community Server - GPL.

怎么解决呢?请看日志,我想你已经知道答案了。

同样的提问:这里如果是在线删除,会丢数据吗?为什么?

4、未完待续

内容太多,下一篇继续。

PS:家里来了一只小奶狗,事情比较多。这条小狗是别人快递买的,然后发现不是想要的品种狗,就想要退货,目的地又是浙江,如果退货,大概率嗝屁(我在云南的一个镇上,一般快递从成都到这里要4-5天,还不要说浙江了)。所以就花钱买下来了,然后家里还有一只在大理捡的狗子,每天遛狗差不多2-3个小时吧。

狗子是人类的好朋友,希望大家都能善待每一只狗子。

MySQL特殊恢复实战-第二讲:各种文件丢失,如何救库


原文始发于微信公众号(库海无涯):MySQL特殊恢复实战-第二讲:各种文件丢失,如何救库

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/241218.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!