首页 > 解决方案 > MySQL“每表文件”,未选择数据库错误

问题描述

我在 Win10 小型机上有一个带有 MySQL 数据库的小型自包含 C# 项目。尽管小而简单,但至少需要对数据库的一个表进行持续的最新备份。添加复制服务器实际上并不可行,因为用户希望它完全易于处理。所以我认为在外部目录(例如,在这台小型计算机上的 USB 记忆棒上)上的“每表文件”可能是解决方案。

根据 MySQL 5.7 参考手册显示:

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/alternative/directory';

我试过这个:

mysql> 创建表 t1 (c1 INT PRIMARY KEY) 数据目录 = '/F/';

我得到:

错误 1046 (3D000): 未选择数据库

当我认为我可以在 USB 记忆棒(驱动器“F”)上创建我的数据库的一个表来保存数据库中重要表的副本时,可能存在完全的误解。

而且我认为调用数据库(mysql -u root -p Enter password: *******)已经选择了我的意思的这个数据库。但当然我可以在相同的用户和密码下拥有更多的数据库......。

因此,如果我没有完全错,我该如何选择数据库?

谢谢你看看这个。

标签: c#mysql

解决方案


这很令人困惑,因为有些人使用“数据库”这个词来表示您登录的 MySQL 实例。但其他人使用“数据库”一词表示架构,就像您可以在其中创建表的文件夹。除非您在模式中创建表,否则您无法创建表。

在 MySQL 中,关键字DATABASESCHEMA是可以互换的。

您应该查看MySQL 教程,尤其是创建和使用数据库

也就是说,我认为您将桌子放在 USB 记忆棒驱动器上的计划无论如何都行不通。file-per-table InnoDB 表空间不是备份。您不能只复制该文件并获取其中的数据,然后将副本恢复到另一个 MySQL 实例。原因是该文件不包含所有数据。当您修改数据时,更改会经过 RAM 和中央表空间中的不同位置,然后最终集成到 file-per-table 文件中。这可能在您的应用程序向 MySQL 提交更改后很长时间才会发生。这些更改是安全的,它们只是在一段时间后才存储在 file-per-table 文件中。

如果您将表存储在 USB 记忆棒驱动器上,并且在它与最近的更改完全同步之前将其从计算机中拉出,您将损坏您的数据库。

另一个问题是 USB 记忆棒驱动器比计算机的主硬盘慢很多倍。如果您尝试将部分数据库存储在 USB 记忆棒驱动器上,则会影响应用程序的性能。你不会喜欢这个结果。

如果您需要经常运行备份,您应该使用提供的备份工具,即mysqldump。如果您使用正确的选项,您可以备份 InnoDB 表而不锁定它:

mysqldump --single-transaction mydatabase mytable > mytable.sql

--single-transaction确保了对表的一致读取而不锁定它(只要表使用 InnoDB 引擎)。它通过使用事务来做到这一点。


回复您的评论:

你可以mysqldump经常跑。但它仍然是你必须运行的东西。每个操作系统都有各种计划程序工具(例如,Windows 10 具有任务计划程序)。

但是,如果您必须考虑硬盘驱动器故障,则需要有一些单独的存储空间。例如,您可以将 mysqldump 的输出放到 USB 驱动器上。或者您可以将转储文件上传到云存储。

我强烈建议您不要将任何 MySQL 表空间配置为驻留在可移动存储上。我在上面写道,它会导致性能下降,并且破坏数据库的风险很高。我不知道如何更清楚地表明这是一件坏事。


推荐阅读