gpt4 book ai didi

c# - MySQL "file-per-table",未选择数据库错误

转载 作者:行者123 更新时间:2023-11-29 07:29:06 25 4
gpt4 key购买 nike

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

根据MySQL 5.7引用手册显示:

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

我试过这个:

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

我得到:

ERROR 1046 (3D000): No database selected

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

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

那么如果我没有完全错的话,我该如何选择数据库呢?

感谢您查看此内容。

最佳答案

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

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

您应该查看 MySQL tutorial , 特别是 Creating and Using a Database .

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

如果您将表格存储在 U 盘上,然后在它与最近的更改完全同步之前将其从计算机中拔出,您将损坏您的数据库。

另一个问题是 U 盘比计算机的主硬盘慢很多倍。如果您尝试将部分数据库存储在 U 盘上,则会损害应用程序的性能。您不会喜欢这个结果。

如果需要经常备份,可以使用提供的备份工具mysqldump .如果使用正确的选项,您可以在不锁定 InnoDB 表的情况下备份它:

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

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


回复你的评论:

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

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

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

关于c# - MySQL "file-per-table",未选择数据库错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52410122/

25 4 0
文章推荐: java - Java中的评估顺序
文章推荐: mysql - 如何从mysql中的重复行中获取单行
文章推荐: java - 如何在 java8 中将 List 转换为 List>