data base file数据库文件损坏如何修复

哦,让我告诉你一件事。
去年我在上海,帮隔壁公司建数据库,差点把服务器搞坏了。

他们的 MySQL 数据库文件突然损坏,整个数据库崩溃了。
我看了看,意识到一切都结束了。
硬盘驱动器可能有问题。
赶紧先备份一下,不然无法恢复。

采用冷备恢复。
停止数据库服务,直接用备份文件替换坏文件。
检索后,数据匹配上,我终于松了一口气。
但如果没有后援,我会晕倒在厕所里,我会哭。

后来我又遇见了他,是在广州。
当时MySQL的主从架构减少了主数据库。
数据丢失的不多,但业务陷入困境。
我让他们切换到从库,用热备份来恢复。
但是,在这种情况下您应该小心并确保数据库的延迟受到控制。
否则数据会不一致,你又要担心了。
还有一次,在深圳,MySQL数据库崩溃了,所以我使用了PITR(时间点恢复)。
他们有完整的备份和额外的日志。
我把它拉回到了事故发生前的某个点。
数据丢失的不多,老板很满意。

我还使用了存储引擎调平方法。
MySQLInnoDB损坏了,所以我使用innodb_force_recovery参数,慢慢尝试步骤1 到步骤6 那个过程令人心碎。
后来我使用ALTER TABLE命令删除了坏表空间并重建它。
你知道,这个操作很危险,但有时你不得不这么做。

我还帮助人们修复 SQL Server。
有一次,怀疑是SQL Server数据库,于是我先备份了MDF和LDF文件,然后删除了怀疑的数据库。
创建一个同名的空数据库并覆盖原始MDF文件。
然后设置为紧急模式,重建日志,最后取消紧急模式。
那个过程非常有趣。

防止这种情况非常重要。
我告诉他们每年定期支持球队,全额+加薪,不要偷懒。
工作时也应该小心。
修改 SQL 查询时,首先在测试环境中运行它,然后不要一开始就跳入生产环境。

修复前备份,这是一个老生常谈的话题,但它确实很重要。
在进行任何维修工作之前,请准备好备份,以防止造成二次损坏。
如果确实没有备份或者无法用正常方法修复,则只能寻求第三方专业服务。
例如,他们有鸿蒙MSC维修服务。
我没试过,不敢乱说。

总之,数据库要小心处理。
备份、预防、预防,记住这三点,避免指示。

Change Data Capture

坦率地说,CDC 只是获取数据库中更改的数据,然后对其进行处理。
它特别适合数据仓库,但可以与任何数据库一起使用。

我们先来说说最重要的表级触发器。
去年我们在一个项目中使用了它。
每当数据发生变化时,都会自动记录在日志表中。
它简单粗暴,但对性能要求很高。
另一件事是日志扫描器,例如 Oracle GoldenGate。
去年年底,客户使用它在Oracle和Hadoop之间传输数据。
他们根本不需要接触原始表,但他们确实需要了解数据库日志格式。
还有一个重要的细节,比如DB2 的IIDR。
我们去年做高可用的时候就用过,但是发现对主数据库性能的影响比预想的要大。
说实话,有点失望。

一开始我以为CDC只有这三个技巧,后来发现有像Debezium这样的开源解决方案,可以和Kafka一起使用,非常适合云环境。
等等,还有别的事。
虽然SQL Server的CDC很简单,但在去年的测试中发现它可能会延迟大表的更新几分钟。
这实际上取决于使用的程度。

建议在选择工具之前先了解一下自己系统的日志格式。
不要只阅读广告。

简介 MySQL日志之redo log和binlog

说白了,redolog和binlog的本质区别在于,redolog负责MySQL崩溃后的恢复,而binlog则负责将数据同步到从库或者任意时间点进行恢复。

红色日志是InnoDB特有的物理日志。
我们去年跑的3 000QPS项目中,它采用了内存+磁盘的方式,先记录数据变化,然后慢慢转储到磁盘。
这个设计特别引人注目。
用俚语来说,这称为雪崩效应。
事实上,前端的一个小延迟就会导致其余部分崩溃——但Red Olog采用先写日志后写数据的WAL机制,彻底降低IO成本。
还有一点是,红色日志是按照固定大小的周期写入的,就像环形缓存一样。
空间通过哨所和检查站的移动进行管理。
这个检查点机制尤为重要。
起初我以为这只是一个同步标志,但后来我意识到我错了。
它还定义了可以安全删除哪些数据。

Binlog是MySQL Server层的逻辑日志,与存储引擎无关。
去年我们做数据恢复的时候,用binlog把一个业务数据库从一个月前的状态恢复到昨天下午3 点。
这就是我们所做的。
该日志是附加到磁盘的纯 SQL 语句或行更改记录。
还有另一个重要的细节。
binlog的写入过程与redlog不同:事务提交时,先将binlog写入磁盘,然后通知InnoDB将redlog标记为commit状态。
说实话,这很令人困惑。
很多人并没有注意到这种两阶段交付机制。
一旦顺序颠倒,主从数据就可以打乱。

等一下,还有一件事。
Binlog有改变binlog格式的概念。
5 .7 之后有两种模式:ROW和STATMENT。
这个是根据业务场景来决定的。
例如,在高并发事务场景下,ROW模式更加稳定。

建议大家了解两阶段提交,这是了解主从复制和崩溃恢复的关键点。

mysql range分区是什么

嘿嘿,说起MySQL的RANGE分区,这个东西对我过去1 0年在Q&A论坛的时候帮助很大。
说实话,这个东西用起来还是蛮有趣的,尤其是在处理大量数据的时候。

我先说一个场景。
我曾经在一家电商公司做数据库优化。
当时销售记录表的数据是按年份来划分的,每年都会有很多条。
当时如果想查询某一年的销售数据,扫描整个表会非常慢。
后来我使用RANGE分区将每年的数据划分到不同的分区。
这样查询某一年的数据就快很多,因为MySQL可以直接访问对应的分区,而不是整个表。

分区键通常是整数类型,例如年份或 ID。
记得有一次,一位同事想要按月分区,发现也可以使用日期类型,比如YEAR类型。
当时我们使用VALUES LESS THAN来定义分区,比如PARTITION p1 VALUES LESS THAN (2 02 1 ),这样2 02 0年的所有数据都会分配到p1 分区。

这个东西的好处,首先是查询性能的提升。
特别是对于时间归档场景,按年或月分区查询要快得多。
此外,管理起来也很方便。
例如,如果要删除历史数据,可以直接删除整个分区。
它比逐行删除要快得多。

不过,这东西也不是万能的。
例如,如果分区键值分散或者无序,那么RANGE分区就不会发挥作用。
再比如,如果分区太多,管理起来很麻烦,必须手动维护分区。

记得有一次,一位同事想要按照用户ID进行分区,但是ID是随机生成的,所以没有办法使用分区剪枝来优化查询。
此外,分区键的频繁更新也会影响性能,因为数据可能需要跨分区移动。

总的来说,RANGE分区用得好是非常有用的,但是一定要根据实际情况来设计。
可能有点极端,但我认为正确设计RANGE分区确实可以显着提高MySQL的查询效率和管理灵活性。