我的 CentOS 7 服务器最近因在运行时拔掉硬盘而崩溃,现在 MariaDB 无法启动,而且我没有收到任何错误日志。
服务器上的其他一切似乎都运行良好,但在磁盘上运行xfs_repair
(类似于fsck
xfs)没有帮助。以下是我收到的具体错误:
$ sudo systemctl start mariadb
Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
$ sudo systemctl -l status mariadb
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sun 2018-07-29 19:34:03 MDT; 1min 22s ago
Process: 21579 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=1/FAILURE)
Process: 21577 ExecStart=/usr/bin/mysqld_safe --basedir=/usr (code=exited, status=0/SUCCESS)
Process: 27150 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=1/FAILURE)
Main PID: 21577 (code=exited, status=0/SUCCESS)
Jul 29 19:34:03 giivaserver systemd[1]: Starting MariaDB database server...
Jul 29 19:34:03 giivaserver mariadb-prepare-db-dir[27150]: Database MariaDB is not initialized, but the directory /var/lib/mysql is not empty, so initialization cannot be done.
Jul 29 19:34:03 giivaserver mariadb-prepare-db-dir[27150]: Make sure the /var/lib/mysql is empty before running mariadb-prepare-db-dir.
Jul 29 19:34:03 giivaserver systemd[1]: mariadb.service: control process exited, code=exited status=1
Jul 29 19:34:03 giivaserver systemd[1]: Failed to start MariaDB database server.
Jul 29 19:34:03 giivaserver systemd[1]: Unit mariadb.service entered failed state.
Jul 29 19:34:03 giivaserver systemd[1]: mariadb.service failed.
据我所知,我没有收到任何关于正在发生的事情的信息,或者为什么它无法启动。我也没有找到任何错误日志文件。
这是我的my.cnf
:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
/var/log/mariadb/
我的或文件夹中没有任何文件/var/run/mariadb/
。我也没有主机名.err(我的情况是 giivaserver.err)按照/var/log/
官方/var/log/mysql
文章中的描述如果 MariaDB 无法启动该怎么办。
我尝试将innodb_force_recovery = 1
增量从 1 增加到 5,[mysqld]
但这my.cnf
并没有影响任何东西。
我也尝试备份并重命名我的/var/lib/mysql
文件夹并重新运行,mysql_install_db
因为网上有人说删除它可能会有帮助,但这没有什么区别。
到目前为止,我已经尝试了所有能想到的方法,但没有从我的系统中找到任何关于为什么 MariaDB 无法启动的反馈。
编辑:
重命名原始文件夹后我的 /var/lib/mysql 文件夹的内容:
drwx------. 6 mysql mysql 122 Jul 29 19:03 .
drwxr-xr-x. 61 root root 4096 Jul 29 19:03 ..
-rw-rw----. 1 mysql mysql 16384 Jul 29 19:02 aria_log.00000001
-rw-rw----. 1 mysql mysql 52 Jul 29 19:02 aria_log_control
drwx------. 2 mysql mysql 4096 Jul 29 19:02 mysql
drwxr-xr-x. 8 mysql mysql 232 Jul 29 18:58 mysqlBAK
drwx------. 2 mysql mysql 4096 Jul 29 19:02 performance_schema
drwx------. 2 mysql mysql 6 Jul 29 19:02 test
答案1
几天后,我终于修好了它,没有任何数据丢失。正如我所料,这次停电并没有造成数据丢失。我做了很多事情来尝试解决这个问题,但我认为以下方法可以解决这个问题:
我重命名了我的/var/lib/mysql
文件夹以确保我有备份,然后删除了我的/etc/my.cnf
文件。我重新安装了 mariadb 和 mariadb-server,然后启动了它。从那里我将备份的/var/lib/mysql
文件夹复制回来,并在我的文件夹中/etc/my.cnf
添加了以下几行(来自这里):
port = 8881
innodb_force_recovery=3
innodb_purge_threads=0
(我认为我实际上使用了恢复模式 4,但 3 对我来说也适用)
从那里,我能够启动 MariaDB 以及我的所有数据库。然后我运行后mysqlcheck --all-databases -p
发现我的数据库都没有损坏。从这里开始,我无法成功停止 MariaDB,然后再次启动它时也遇到了问题,因此我重复了删除文件夹/var/lib/mysql/
并运行数据库安装的过程,以便我可以重新复制备份。
从那里我启动了 MariaDB 并使用 InnoDB 强制恢复,一旦它运行,我使用命令转储所有内容mysqldump -u root -p --all-databases > alldb.sql
。然后我强制停止 MariaDB,因为它无法正常停止,然后重新启动。我卸载了 MariaDB,删除了我的/var/lib/mysql/
,并重命名了我的/etc/my.cnf
,然后重新安装了 MariaDB。一旦我让它重新运行,我使用导入了我转储的数据库,mysql -u root -p < alldb.sql
并使用在 MySQL shell 中刷新了权限FLUSH PRIVILEGES;
,现在一切都运行良好,没有数据丢失。
由于我运行的是 CentOS,因此我必须在此过程中执行一些 SELinux 操作。我主要只是按照弹出诊断对话框的操作进行操作,然后重新运行我在安装 Nextcloud 服务器时最初执行的 SELinux 命令,以获得正确的所有权限。
答案2
看起来数据库存储已损坏。从备份中恢复,并在硬盘上贴上大标志,“运行时请勿拔掉电源”。
答案3
就我而言,将 /var/lib/mysql 文件移至 /var/lib/mysql-save 并重新启动也效果很好,因为 mysql 启动正常。
然后查看 mysql 中的两个目录:
ls /var/lib/mysql
total 110628
-rw-rw---- 1 mysql mysql 16384 Dec 5 12:32 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Dec 5 12:32 aria_log_control
-rw-rw---- 1 mysql mysql 976 Dec 5 12:32 ib_buffer_pool
-rw-rw---- 1 mysql mysql 12582912 Dec 5 12:32 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Dec 5 12:32 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Dec 5 12:29 ib_logfile1
-rw-rw---- 1 mysql mysql 0 Dec 5 12:30 multi-master.info
drwx------ 2 mysql mysql 4096 Dec 5 12:29 mysql
drwx------ 2 mysql mysql 4096 Dec 5 12:29 performance_schema
drwx------ 2 mysql mysql 4096 Dec 5 12:29 test
在我的保存目录中:
ls -l /var/lib/mysql-saved
-rw-rw---- 1 mysql mysql 16384 Dec 5 12:23 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Dec 5 12:23 aria_log_control
-rw-r--r-- 1 root root 0 Dec 4 21:43 debian-10.3.flag
-rw-rw---- 1 mysql mysql 2372 Dec 5 12:23 ib_buffer_pool
-rw-rw---- 1 mysql mysql 79691776 Dec 5 12:23 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Dec 5 12:23 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Dec 4 20:23 ib_logfile1
-rw-rw---- 1 mysql mysql 0 Sep 1 2020 multi-master.info
drwx------ 2 mysql mysql 4096 May 11 2021 mysql
drwx------ 2 mysql mysql 4096 Jun 21 09:30 owncloud
drwx------ 2 mysql mysql 4096 May 11 2021 performance_schema
-rw-rw---- 1 mysql mysql 0 Dec 4 18:09 tc.log
Owncloud 是我的数据库,但是这个 tc.log 文件是什么?原来它是 mysql 用来记录进程中可能需要在崩溃后重新启动的事务的事务日志。
好吧,显然 mysql 不能妥善处理零长度的 tc.log 文件;它只是退出。因此删除该文件,一切就会正常启动。
你问的是哪个版本?:
mysql --version
mysql Ver 15.1 Distrib 10.3.31-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2