大家晚上好~今天聊WAL日志,这个日志不知道你们有没有用过,但是应该都是听过的。WAL存在于各大数据库中,主要是为了解决数据安全的问题。
为什么是解决数据安全呢?因为他的目的是在每个操作即将运行显现在数据库之前,都会将【操作】本身记录下来。举个例子,比如我说我要从银行卡01取100块钱,银行在给我100块钱的时候,她会记录下【某某某在某时某地用某卡想要取100块】。所以如果在我把卡放入ATM机时,ATM机把我卡吞了,出现故障,但是我手机已经显示100元到账了,如果返回ATM机器余额查询界面,那我ATM机上的余额会不会减少呢?如果不会的话,我是不是赚了100元?
没这么简单。现实是如果ATM机崩溃,等我下一次查询余额,我还是会减少100块。这就是WAL日志的魔力。WAL保存了你【原先余额200元,后续要取100元,而且取成功了。】的这个记录,当银行崩溃恢复后,会用WAL日志再次做一次对应的操作,这样对于银行来说,数据不会丢失。
几乎所有的数据库都有这个WAL日志,但是我们有那么多操作,每天无数的增删改查、无数的操作,这样日志不是会爆满吗?而且日志是不是按照一个人的操作来记录,还是可以多人做?分布式数据库时,主库和备库的WAL日志是怎么处理的?我们来详细了解一下吧~~
首先,WAL日志是什么?是存放在数据库固定路径的一堆文件,不同数据库不同路径。你看不懂的,因为是一堆二进制文件,如果是PostgreSQL数据库,那可能是一对截断的二进制,比如可能原先一个操作30位,但是固定16位,你看到的就是16位。对于MySQL来说,就是两个日志文件循环写。作为开发你不需要懂,但作为DBA你需要知道它的存储空间还有多少,而且要固定用语句查查。
所以回到第一个问题,每天无数的增删改查、无数的操作,这样日志不是会爆满吗?不会,有些数据库会根据检查点定期删除,有些会循环覆盖文件,除非出问题,如分布式数据库的备库一直不同步主库,WAL日志都要爆满了(因为WAL日志在传统模式中常常是放在主库中),这个时候 就需要人工干预。
第二个问题~而且日志是不是按照一个人的操作来记录,还是可以多人做?不同数据库机制不同,如SQLite就能多人写。分布式数据库时,主库和备库的WAL日志是怎么处理的?举个例子,当你在电商下单时:主库记录"订单已创建"(WAL1),同时把WAL1发给3个备库,至少2个备库回复"收到"后,主库才告诉你"下单成功",此时即使主库宕机,备库也有完整记录。
而有些数据库只会等待主库推WAL1过来,而有些数据库会拉WAL1过来,这个需要你具体去了解啦~
希望能让你对WAL有个简单的了解。
感兴趣可以添加我的微信公众号【会用数据库】
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。