每次服务器崩溃时,mysql 数据库中的表都会损坏

val*_*ter 1 mysql database

有件事让我发疯......我在一个数据库中有一个表,超过 1.4 GB,有大约 500.000 条记录。

问题是每次或几乎所有时间,由于过载或任何其他问题,我的服务器崩溃,该表都会损坏。

这就是我的想法,因为使用它的网站会永远加载,并且服务器会过载。要修复,我需要运行修复表 TABLE。

我能做些什么来避免这种情况吗?

Rol*_*DBA 5

将表转换为InnoDB。这样做有几个原因:

原因 1:MyISAM 表对每个 INSERT、UPDATE 和 DELETE 执行全表锁定。由于MVCC(多版本并发控制),InnoDB 执行仍可读取的行级锁

原因 2:使用 InnoDB 进行崩溃恢复可以像重新启动 MySQL 一样简单,因为重做日志记录未提交的事务,并且通过事务的正常提交或在 mysql 启动期间进行处理。

原因 3:MyISAM 表在其标头中维护一个计数器,用于针对该表的打开文件句柄。最简单的“崩溃”MyISAM 表是一个数据很好但在表关闭时打开文件句柄计数大于零的表。对 MyISAM 表执行 'myisamchk -r' 或 REPAIR TABLE 总是有丢失一行或多行数据的风险。

原因 4:InnoDB符合 ACID(原子性、一致性、隔离性、持久性)。事务可以由一个或多个 SQL 语句组成,并将它们视为一种操作(因此,原子性)。数据要么完全提交,要么完全回滚(因此具有一致性和持久性)。每个数据库连接在更新时都可以拥有自己的数据视图而不会被锁定(因此通过 MVCC 进行隔离)。