c# - 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: *******)已经选择了我的意思的这个数据库。但当然我可以在相同的用户和密码下拥有更多的数据库......。
因此,如果我没有完全错,我该如何选择数据库?
谢谢你看看这个。
解决方案
这很令人困惑,因为有些人使用“数据库”这个词来表示您登录的 MySQL 实例。但其他人使用“数据库”一词表示架构,就像您可以在其中创建表的文件夹。除非您在模式中创建表,否则您无法创建表。
在 MySQL 中,关键字DATABASE
和SCHEMA
是可以互换的。
也就是说,我认为您将桌子放在 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 表空间配置为驻留在可移动存储上。我在上面写道,它会导致性能下降,并且破坏数据库的风险很高。我不知道如何更清楚地表明这是一件坏事。
推荐阅读
- javascript - executeJavaScript 没有给出错误但不会执行代码
- apache-spark - Spark shuffle 错误:不正确的标头或版本不匹配错误
- sql - 根据带有附加列的两列选择不同的行
- gatsby - 使用 Gatsby 的对讲插件集成对讲
- node.js - dialogflow-fulfillment-library 和 express,要依靠什么?
- python - 创建单独的列,其标题基于列中的值
- contiki - 由于 Contiki 中的附加代码,减少了 CPU 时间
- java - 具有 1:n 关系的 SQL 查询,查找具有两个匹配子项的所有实体
- python - 在 Python 3 中从字符串创建 Python 对象
- c# - 使用 Null 从 C# 调用 Oracle 函数