MySQL“每表文件”,未选择数据库错误

时间:2018-09-19 16:10:01

标签: c# mysql

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

根据MySQL 5.7参考手册显示:

  

mysql>创建表t1(c1 INT主键)数据目录='/ alternative / directory';

我尝试过:

  

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

我得到:

  

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

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

我以为调用数据库(mysql -u root -p 输入密码:*******)已经选择了这个数据库。但是我当然可以在相同的用户名和密码下拥有更多的数据库。

因此,如果我不是完全错误,我该如何选择数据库?

感谢您对此的关注。

1 个答案:

答案 0 :(得分:1)

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

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

您应该查看MySQL tutorial,尤其是Creating and Using a Database

也就是说,我认为您将桌子放在USB闪存盘上的计划无论如何都行不通。每表文件InnoDB表空间不是备份。您不能只复制该文件并获取其中的数据,然后将副本还原到另一个MySQL实例。原因是该文件未包含所有数据。修改数据时,更改将最终通过RAM和中央表空间中的不同位置,然后最终集成到每个表文件中。在您的应用将更改提交到MySQL之后,很可能会发生这种情况。所做的更改是安全的,只是在一段时间之后才将它们存储在每表文件中。

如果将表存储在USB随身碟中,并且在计算机与最近的更改完全同步之前从计算机中将其删除,则您将破坏数据库。

另一个问题是USB记忆棒驱动器的速度比计算机的主硬盘慢许多倍。如果您尝试将部分数据库存储在USB随身碟中,则会损害应用程序的性能。您不会喜欢结果。

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

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

--single-transaction确保在不锁定表的情况下对表进行一致的读取(只要表使用InnoDB引擎即可)。它通过使用事务来实现。


发表评论:

您可以非常频繁地运行mysqldump。但这仍然是您必须运行的东西。每个操作系统都有各种调度程序工具(例如,Windows 10具有Task Scheduler)。

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

我强烈建议您不要将任何MySQL表空间配置为驻留在可移动存储上。我在上面写道,它将导致性能下降,并有损坏数据库的高风险。我不知道该怎么做才更清楚。