我在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 输入密码:*******)已经选择了这个数据库。但是我当然可以在相同的用户名和密码下拥有更多的数据库。
因此,如果我不是完全错误,我该如何选择数据库?
感谢您对此的关注。
答案 0 :(得分:1)
这令人困惑,因为有些人使用“数据库”一词来表示您登录的MySQL实例。但是其他人使用“数据库”一词表示模式,就像一个可以在其中创建表的文件夹。除非您在架构中进行操作,否则无法创建表。
在MySQL中,关键字DATABASE
和SCHEMA
可以互换。
您应该查看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表空间配置为驻留在可移动存储上。我在上面写道,它将导致性能下降,并有损坏数据库的高风险。我不知道该怎么做才更清楚。