![是否可以从 /var/lib/mysql/database 文件夹恢复 mysql 数据库?](https://linux22.com/image/896596/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BB%8E%20%2Fvar%2Flib%2Fmysql%2Fdatabase%20%E6%96%87%E4%BB%B6%E5%A4%B9%E6%81%A2%E5%A4%8D%20mysql%20%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%9F.png)
由于一场噩梦不知怎么变成了现实,我的 mysql 安装最终被重新安装。在重新安装之前我无法启动 mysql,因此无法使用 mysqldump 进行正确备份。不过,我确实将 /var/lib/mysql 复制到了一个安全的地方。尝试将数据库文件夹 rsync 回其旧位置不起作用——好吧,它有点起作用,但随后 wordpress 崩溃了,即使权限已更正。如果我手动创建该数据库然后 rsync 它,mysql 将无法启动。
是否有可能以某种方式恢复该文件夹?
编辑:我现在有了它,所以我可以在 mysql 提示符中看到该文件夹。我可以使用该数据库,但尝试 SELECT * FROM wp_posts; 会给我
mysql> SELECT * FROM wp_posts;
ERROR 1146 (42S02): Table 'alfheimwp.wp_posts' doesn't exist
尽管
mysql> SHOW TABLES;
+-------------------------------------------------+
| Tables_in_alfheimwp |
+-------------------------------------------------+
| wp_bp_activity |
| wp_bp_activity_meta |
| wp_bp_friends |
| wp_bp_groups |
| wp_bp_groups_groupmeta |
| wp_bp_groups_members |
| wp_bp_messages_messages |
| wp_bp_messages_meta |
| wp_bp_messages_notices |
| wp_bp_messages_recipients |
| wp_bp_notifications |
| wp_bp_notifications_meta |
| wp_bp_user_blogs |
| wp_bp_user_blogs_blogmeta |
| wp_bp_xprofile_data |
| wp_bp_xprofile_fields |
| wp_bp_xprofile_groups |
| wp_bp_xprofile_meta |
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_sg_action |
| wp_sg_config |
| wp_sg_schedule |
| wp_signups |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_ucare_logs |
| wp_usermeta |
| wp_users |
| wp_woocommerce_api_keys |
| wp_woocommerce_attribute_taxonomies |
| wp_woocommerce_downloadable_product_permissions |
| wp_woocommerce_log |
| wp_woocommerce_order_itemmeta |
| wp_woocommerce_order_items |
| wp_woocommerce_payment_tokenmeta |
| wp_woocommerce_payment_tokens |
| wp_woocommerce_sessions |
| wp_woocommerce_shipping_zone_locations |
| wp_woocommerce_shipping_zone_methods |
| wp_woocommerce_shipping_zones |
| wp_woocommerce_tax_rate_locations |
| wp_woocommerce_tax_rates |
| wp_wpsp_agent_settings |
| wp_wpsp_attachments |
| wp_wpsp_canned_reply |
| wp_wpsp_catagories |
| wp_wpsp_custom_fields |
| wp_wpsp_custom_priority |
| wp_wpsp_custom_status |
| wp_wpsp_faq |
| wp_wpsp_faq_catagories |
| wp_wpsp_panel_custom_menu |
| wp_wpsp_ticket |
| wp_wpsp_ticket_thread |
+-------------------------------------------------+
61 rows in set (0.00 sec)
因此,显然这个数据库缺少 mysql 的某些功能,但这是我之前使用的 mysql 的完全相同的版本。
编辑 2:终于开始取得一些进展,但我陷入了兔子洞深处,我需要一个 innodb 助手......现在 mysql 无法启动:
2017-10-13T01:55:16.625761Z 0 [ERROR] [FATAL] InnoDB: Tablespace id is 1121 in the data dictionary but in file ./mysql/help_relation.ibd it is 6!
我无法从表中读取数据的原因是因为我没有将 innodb 文件还原到邮件 /var/lib/mysql 文件夹中。现在我已经还原了,但是这些表空间 ID 并没有对齐。我不知道如何编辑它们,甚至不知道这是否是解决问题的方法。我希望有一种自动的方法来纠正这些问题!
答案1
好的,开始吧。因此,您需要彻底清除 mysql。此时不要尝试切换到 mariadb,它根本行不通(尽管删除了与 mysql 相关的每个文件,但无法更改 root 密码)。
[编辑:我后来意识到这是因为我没有以 root 身份运行 mariadb。出于某种原因,如果您安装了 mariadb,则必须使用 启动提示符sudo mysql -u root -p
。因此,理论上 mariadb 也应该适用于此过程。]
您需要重新安装 mysql-server。首先删除所有与 mysql 相关的文件,然后
sudo apt-get purge mysql-server* mariadb*
然后删除所有与 mysql 相关的文件夹(确保您已经对整个 /var/lib/mysql 文件夹进行了安全备份)。
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
sudo rm -rf /var/log/mysql
然后重新安装 mysql-server。如果出现愚蠢的依赖性错误,请执行以下操作
ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d
(或者反过来,现在记不清了)然后运行
sudo apt-get install mysql-server
再次启动并让它完成设置。使用以下命令停止 mysql 服务器
sudo systemctl stop mysql
然后仅将数据库文件夹(及其所有内容)复制回 /var/lib/mysql。然后将 ib* 也复制到 /var/lib/mysql(这些是 innodb 字典和其他文件)。
sudo rsync -r <backedupfolder>/ib* /var/lib/mysql/
确保做到
sudo chown -R mysql:mysql /var/lib/mysql
编辑 /etc/mysql/my.cnf 并添加innodb_force_recovery=5
到[mysqld]
部分(您可能需要添加 [mysqld])。现在使用 重新启动 mysql systemctl start mysql
。如果您查看,/var/log/mysql/error.log
可能仍会看到错误,但是请尝试使用
mysql -u root -p
如果你能够启动它,那就太好了。如果不能,再看看 systemctl status mysql.service 并看看它说了什么。这可能是权限问题。如果你终于能够进入提示符,请立即执行
mysqldump -u root -p <databasename> > database.sql
这样我们就可以得到该数据库的干净转储。现在我们已经有了重要数据库的干净转储,我们需要重新执行前几个步骤(至少我这样做了,以确保万无一失……此时我能够启动 WordPress,但无法登录)。因此,重新执行前几个清理步骤,在卸载 mysql-server 后删除所有 mysql 目录。重新安装,但这次只需运行
mysql -u root -p <databasename> < database.sql
你应该成功了!你可能需要重新创建数据库(CREATE DATABASE databasename;
)不要忘记重新创建之前拥有该数据库的用户(如果你忘记了,请查看你的 /var/www/html/wp-config.php 或你的 wp-config.php 所在的任何其他位置以获取详细信息)。