在 AWS RDS 中恢复 mysql 备份后,我收到“表不存在”:
Server version: 5.7.22-log Source distribution
mysql> show tables;
+----------------------------+
| Tables_in_db |
+----------------------------+
| foo |
...
mysql> select * from foo;
ERROR 1146 (42S02): Table 'db.foo' doesn't exist
此错误在 serverfault 和 stackoverflow 上随处可见。建议通常是停止服务器、检查文件系统中的文件等。
我认为我无法访问 AWS 上的服务器或文件系统。我被骗了吗?
我该如何向 AWS 提交工单?
编辑:我删除了上面的一个多余的句号,因为它不在实际示例中。这个多余的句号(现在消失了)导致有人在下面进行了一些惊人的调试,但这不是我的问题。
此外,我还找到了如何向 AWS 提交罚单的方法这里。
答案1
我想我已经重现了你的问题:
mysql> use test
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| collorder |
| collorder2 |
+----------------+
2 rows in set (0.00 sec)
mysql> CREATE DATABASE `test .`;
mysql> USE `test .`;
mysql> CREATE TABLE foo (x int);
mysql> SHOW TABLES;
+------------------+
| Tables_in_test . |
+------------------+
| foo |
+------------------+
1 row in set (0.00 sec)
mysql> USE test;
mysql> SELECT * FROM foo;
ERROR 1146 (42S02): Table 'test.foo' doesn't exist
如果你不明白我做了什么,让我们尝试一下:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| test . |
+--------------------+
现在明显了吗?
做这个:
SELECT schema_name, char_length(schema_name), hex(schema_name)
FROM information_schema.schemata;
查看详情。
答案2
问题出在我使用了一些复杂的方向将 MySQL 从 utf8(一个陷阱)转换为 utf8mb4,并通过在禁用约束的情况下将约束的两侧更改为不同类型的方式破坏了一些外键约束。我不是在责怪指令,但这是一个微妙的操作。我责怪 MySQL 的默认设置很糟糕(“utf8”并非全部都是 utf8),而且没有简单的过程来找到正确的位置。
这些错误的外键约束使备份“成功”,但数据无法正确恢复(但直到我尝试从表中选择时才出现恢复错误)。