![恢复 mysql 数据库 - mysql/mysqldump 给出“表。不存在 (1146)”](https://linux22.com/image/600809/%E6%81%A2%E5%A4%8D%20mysql%20%E6%95%B0%E6%8D%AE%E5%BA%93%20-%20mysql%2Fmysqldump%20%E7%BB%99%E5%87%BA%E2%80%9C%E8%A1%A8%E3%80%82%E4%B8%8D%E5%AD%98%E5%9C%A8%20(1146)%E2%80%9D.png)
背景故事
Ubuntu 死机了(无法启动),我无法修复它。我启动了一张实时 CD 来恢复重要内容并将其保存到我的 NAS。我备份的内容之一是 /var/lib/mysql。
由于我使用的是 Ubuntu 10.0.4,因此重新安装了 Linux Mint,这是尝试新发行版的好机会(我不喜欢 Unity)。现在我想恢复旧的 mediawiki,因此我关闭了 mysql 守护程序,cp -R /media/NAS/Backup/mysql/mediawiki@002d1_19_1 /var/lib/mysql/
正确设置了文件所有权和权限,然后重新启动 mysql。
问题
现在我正试图导出数据库所以我可以恢复数据库,但是当我执行 mysqldump 时出现错误:
$ mysqldump -u mediawikiuser -p mediawiki-1_19_1 -c | gzip -9 > wiki.2012-11-15.sql.gz
Enter password:
mysqldump: Got error: 1146: Table 'mediawiki-1_19_1.archive' doesn't exist when using LOCK TABLES
我尝试过的事情
我尝试使用--skip-lock-tables
,但得到了这个:
Error: Couldn't read status information for table archive ()
mysqldump: Couldn't execute 'show create table `archive`': Table 'mediawiki-1_19_1.archive' doesn't exist (1146)
我尝试登录到 mysql 并且我可以列出应该存在的表,但是尝试从它们中获取describe
或select
输出错误的方式与转储相同:
mysql> show tables;
+----------------------------+
| Tables_in_mediawiki-1_19_1 |
+----------------------------+
| archive |
| category |
| categorylinks |
...
| user_properties |
| valid_tag |
| watchlist |
+----------------------------+
49 rows in set (0.00 sec)
mysql> describe archive;
ERROR 1146 (42S02): Table 'mediawiki-1_19_1.archive' doesn't exist
我相信 mediawiki 是使用 innodb 和二进制数据安装的。
我是不是被搞砸了?有没有什么办法可以挽回?
答案1
发现有人问类似的问题:MySQL > 表不存在。但它确实存在(或应该存在)。
麦克·达克雷有解决我问题的答案。问题是 ib_logfile0 和 ib_logfile1(可能还有 mysql/ 根目录中的一些其他 ib* 文件)与我新安装的 mysql 不一致。您不能只从旧的 mysql/ 目录中放入 db 文件并期望它能正常工作。
我为恢复数据库所做的操作是在全新安装时备份当前的 /var/lib/mysql/:
$ sudo service mysql stop # Stop mysql. Command could be different on different distros
$ sudo mv /var/lib/mysql ~/mysql.bku
然后将紧急备份目录复制到/var/lib
$ sudo cp -R /media/NAS/Backup/mysql /var/lib/
然后适当地设置权限(如果需要,请参阅 ~/mysql.bku/ 以获取参考)。可能有更高效的命令,但为了完整性,我把我所知道的都包括进去,以防经验较少的人可能需要它。
$ sudo chown -R mysql:mysql /var/lib/mysql
$ sudo find /var/lib/mysql/ -type d -exec chmod 700 {} \;
$ sudo find /var/lib/mysql/ -type f -exec chmod 660 {} \;
$ sudo chmod 644 /var/lib/mysql/debian-5.1.flag # Not sure what this is but the permissions were a bit different so include it just in case
并再次启动mysql
$ sudo service mysql start # Again command might be different on different distros
然后我备份了我需要的数据库:
$ mysqldump -u root -p mediawiki-1_19_1 -c | gzip -9 > wiki.2012-11-15.sql.gz
完成后,我将 mysql/ 目录放回原处,然后从转储文件中导入数据库。
$ sudo service mysql stop
$ sudo mv /var/lib/mysql ~/mysql-discard # Too nervous to start typing "sudo rm -r /" for /var/lib/mysql, so move it away instead
$ sudo mv ~/mysql.bku /var/lib/mysql
$ sudo service mysql start
问题解决了,我现在可以正确导出数据库,mysql 也运行正常。剩下的就是按照从备份恢复 wiki指导。
答案2
你可以试试:
- 确保表的数据文件确实存在于中
/var/db/mysql
,或者您的特定安装/发行版放置它们的位置。 - 仔细阅读 mysql 错误日志,通常在上面的目录中。
- 使用
mysqlcheck --repair
。 - 使 mySQL 脱机并运行
myisamchk
。 - 希望您在其他地方有一个好的备份,或者存档表不是非常重要。