有一些东西让我发疯了…我在一个数据库中有一个表,超过了1.4 GB,有大约500.000条logging。
问题是,每次或几乎所有的时间,我的服务器崩溃,由于过载,或任何其他问题,这个表被损坏。
这是我的想法,因为,使用它的网站,永久加载,服务器超载。 要修复,我需要运行修复表TABLE。
有什么我可以做,以避免这一点?
将表转换为InnoDB 。 这样做有几个原因:
原因1 :MyISAM表使用每个INSERT,UPDATE和DELETE执行全表锁。 InnoDB执行行级锁,由于MVCC(Multiversion并发控制)
原因2 :使用InnoDB进行崩溃恢复可以像重启MySQL一样简单,因为重做日志logging未提交的事务,并且通过正常的事务提交或在mysql启动过程中进行处理。
原因3 :MyISAM表在其头文件中维护一个针对表的打开文件句柄的计数器。 最简单的“崩溃”的MyISAM表是一个数据表很好的表,但当表closures时,其打开的文件句柄数大于零。 对MyISAM表执行“myisamchk -r”或REPAIR TABLE总是会失去一行或多行数据。
原因4 :InnoDB具有ACID(Atomicity,Consistency,Isolation,Durability)合规性。 事务可以由一个或多个SQL语句组成,并将它们视为一个操作(因此,Atomicity)。 数据是完全提交或完全回滚(因此一致性和持久性)。 每个数据库连接都可以在数据被更新而没有被locking的情况下拥有自己的数据视图(通过MVCC进行隔离)。
一个不一致的状态表(例如,如果服务器崩溃)应该需要修复,以检查和修复由于磁盘状态不一致而导致的任何问题(部分完全改变等) – 这在devise上非常有用。
我build议把这个努力减less服务器崩溃。
可能值得投入一些时间来稳定服务器,因为我不认为你可以避免修复表。