我正在尝试为一个很小的程序创建一个数据库,只有我和另外2个朋友使用它,因此数据库将很少。
我想与这2个朋友共享此数据库,所以我考虑将数据存储在OneDrive共享文件夹中。
目前,我正在使用txt文件作为“数据库”。该文件位于共享的OneDrive文件夹中,因此当我的朋友执行该程序时,它可以从那里读取数据并使它成为实时的“联机”。
问题是我找不到我的my.ini文件
C:\Program Files\MySQL\MySQL Server 8.0\
目录,所以我不能更改数据文件夹。
我遇到的另一个麻烦是我在该目录中也没有Data文件夹,而是在这个目录中找到了它:
C:\Program Files\MySQL\MySQL Workbench 8.0 CE
可以做我想做的事吗?而我应该如何进行?
您认为我应该使用MySQL 5.x版本吗?
谢谢
答案 0 :(得分:0)
如果要与其他几个用户共享数据库,则将datadir放在OneDrive中将无法正常工作。
MySQL将数据存储在datadir下的文件中,这是事实。它们存储在扩展名为.ibd
的名为 tablespaces 的文件中。
但是当您执行INSERT / UPDATE / DELETE操作时,数据临时存储在内存和事务日志中(ib_logfile*
。MySQL必须在它们之间进行精细的协调,以持久地保存数据,同时确保良好的性能。它可以很好地工作,但前提是MySQL Server是唯一写入文件的进程。
OneDrive根本不与MySQL协调。自上次进行同步以来,它将定期检查是否已更改文件。 OneDrive检查文件的间隔大约是每10分钟一次,这是不可配置的。
在完成一些INSERT / UPDATE / DELETE操作之后,OneDrive可能会选择立即同步文件,并且数据已在RAM中修改,但尚未在磁盘上的表空间文件中更新。
提交更改后,即使未在表空间中进行更新,也必须将其安全地存储在事务日志中。但是,如果您的朋友以这种状态接收文件(事务日志包含表空间中不存在的更改),则他们可以从您的RAM中重建未获取的数据。这称为InnoDB crash recovery。如果启动并发现事务日志包含表空间中没有的更改,MySQL Server会自动执行。假定您突然重启并丢失了RAM中的内容。
如果您的朋友试图仅使他们的MySQL Server连续运行,读取由他们的OneDrive同时更新的数据目录,则它将基本上覆盖他们的文件,并且MySQL将变得混乱。它仅检查在MySQL Server启动时是否应该进行崩溃恢复。因此,如果在MySQL服务器已经运行时文件以意外的方式更改,则只会得出您的硬盘已损坏的结论。它可能会报告一个致命错误并关闭MySQL。
此外,如果您的朋友尝试对数据库进行自己的更改,则他们的更改将与OneDrive中的更新冲突。然后,他们尝试覆盖文件的尝试最终将通过OneDrive在相反的方向上进行同步,并最终也将破坏您的数据库。每当OneDrive选择进行文件同步时,便会在没有警告的情况下每隔10分钟发生一次。
因此,我担心OneDrive不是共享数据库的解决方案。
在大家共享的网站上托管一个MySQL Server实例,并为每个用户提供可以使用该数据库的客户端。受欢迎的免费客户端是phpMyAdmin。这样一来,就只有一个MySQL Server实例和一个datadir,即使你们每个都是读取和写入数据的并发客户端。这是最简单的解决方案,最有可能起作用。
定期使用mysqldump从MySQL Server实例中导出数据,并将导出文件放在OneDrive上,或者通过电子邮件或其他任何方式将其发送给您的朋友。然后,他们将不得不手动将数据导入其MySQL Server。这将覆盖他们对数据库所做的任何更改,但不会显示为损坏。如果他们想将更改发送回给您,他们可以执行类似的操作:导出数据库,将转储文件放在OneDrive上,然后您将获得其转储文件并将其导入到MySQL Server实例中,覆盖您所做的所有更改自上次您将导出内容发送给朋友以来,就在本地完成。
使用MySQL附加组件进行多服务器同步复制,例如InnoDB Group Replication或Percona XtraDB Cluster。但是,如果您是MySQL的新手,那么对于您来说,设置起来可能太复杂了。