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

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

有些事情让我抓狂...我在一个数据库中有一张表,大小超过 1.4 GB 并有大约 500,000 条记录。

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

我就是这么想的,因为使用它的网站会一直加载,服务器会超载。要修复,我需要运行修复表 TABLE。

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

答案1

将表转换为数据库引擎InnoDB这样做的原因有以下几点:

原因 1:MyISAM 表在每次 INSERT、UPDATE 和 DELETE 时执行全表锁定。InnoDB 执行行级锁定,但由于MVCC(多版本并发控制)

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

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

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

答案2

处于不一致状态的表(例如,如果服务器崩溃)应该需要修复以检查并修复由于磁盘状态不一致(部分完全更改等)导致的任何问题 - 这是设计使然。

我建议努力减少服务器崩溃的发生。

答案3

可能值得花一些时间来稳定整个服务器,因为我认为你无法避免修复表格。

相关内容