是否可以从 /var/lib/mysql/database 文件夹中恢复 mysql 数据库?

Aur*_*ius 10 mysql wordpress restore

由于不知何故成为现实的噩梦,我的 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
Run Code Online (Sandbox Code Playgroud)

尽管事实上

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)
Run Code Online (Sandbox Code Playgroud)

所以很明显,这个数据库缺少 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!
Run Code Online (Sandbox Code Playgroud)

我无法从表中读取的原因是因为我没有将 innodb 文件恢复到邮件 /var/lib/mysql 文件夹中。但是,现在我有了这些表空间 ID 并没有对齐。我不知道如何编辑它们,或者这是否是解决问题的方法。我希望有一种自动化的方法来纠正这些!

Aur*_*ius 8

好的,这就去。因此,您需要彻底清除 mysql。此时甚至不要尝试切换到 mariadb,它根本无法工作(尽管删除了与 mysql 相关的每个文件,但无法更改 root 密码)。

[编辑:我后来意识到这是因为我没有以 root 身份运行 mariadb。出于某种原因,如果您安装了 mariadb,则必须以sudo mysql -u root -p. 所以理论上 mariadb 也应该适用于这个过程。]

您需要全新安装 mysql-server。首先删除与 mysql 相关的所有内容

sudo apt-get purge mysql-server* mariadb*
Run Code Online (Sandbox Code Playgroud)

然后删除所有与 mysql 相关的文件夹(确保您已经对整个 /var/lib/mysql 文件夹进行了安全备份)。

sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
sudo rm -rf /var/log/mysql
Run Code Online (Sandbox Code Playgroud)

然后重新安装mysql-server。如果它因愚蠢的依赖错误而失败,请执行

ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d
Run Code Online (Sandbox Code Playgroud)

(或者反过来,现在不记得了)然后运行

sudo apt-get install mysql-server 
Run Code Online (Sandbox Code Playgroud)

再次并让它完成设置。停止mysql服务器

sudo systemctl stop mysql
Run Code Online (Sandbox Code Playgroud)

然后将数据库文件夹(及其所有内容)复制回 /var/lib/mysql。然后也将 ib* 复制到 /var/lib/mysql (这些是 innodb 字典和其他文件)。

sudo rsync -r <backedupfolder>/ib* /var/lib/mysql/
Run Code Online (Sandbox Code Playgroud)

确保做

sudo chown -R mysql:mysql /var/lib/mysql 
Run Code Online (Sandbox Code Playgroud)

编辑 /etc/mysql/my.cnf 并添加innodb_force_recovery=5到该[mysqld]部分(您可能需要添加 [mysqld])。现在再次启动 mysql systemctl start mysql。如果您查看,/var/log/mysql/error.log您可能仍会看到错误,但是请尝试使用以下命令进入提示

mysql -u root -p
Run Code Online (Sandbox Code Playgroud)

如果你能启动它,那太好了。如果没有,再看看 systemctl status mysql.service 看看它说了什么。可能是权限问题。如果您最终能够进入提示,请立即执行

mysqldump -u root -p <databasename> > database.sql 
Run Code Online (Sandbox Code Playgroud)

所以我们可以获得该数据库的干净转储。现在我们有重要数据库的干净转储,我们需要重做前几个步骤(至少我做了,可以肯定......此时我能够启动WordPress,但我无法登录在)。所以重做前几个清理步骤,卸载mysql-server后删除所有mysql目录。重新安装,但这次只是运行

 mysql -u root -p <databasename> < database.sql
Run Code Online (Sandbox Code Playgroud)

你应该是金色的!您可能需要重新创建数据库 ( CREATE DATABASE databasename;) 不要忘记重新创建之前拥有该数据库的用户(如果您忘记了,请查看您的 /var/www/html/wp-config.php 或任何地方否则您的 wp-config.php 用于详细信息)。