MariaDB10.3 系统版本表 有效防止数据丢失(2)

系统版本表存储了所有的历史数据,随着时间的推移,历史版本数据会变得越来越大,那么我们就可以将其最老的历史数据删除。
例:将p0分区删除
ALTER TABLE t1 DROP PARTITION p0;

六、正确使用姿势

通过上述介绍,我们了解了系统版本表的原理。在高并发写入场景下,势必会带来性能上的损失,所以要用正确的姿势开启该功能。

例:主库是MySQL 5.6或者MariaDB 10.0/1/2版本,搭建一个新从库MariaDB 10.3,在该从库上转换为系统版本控制表。这样主库上误删或误篡改数据,可以在从库上通过版本控制找回。

MariaDB10.3 系统版本表 有效防止数据丢失


注:主库是低版本,从库是高版本,是可以向前兼容binlog格式的。

七、注意事项

1、参数system_versioning_alter_history要设置为KEEP(在my.cnf配置文件里写死),否则默认不能执行DDL修改表结构操作。
set global system_versioning_alter_history = 'KEEP';

注:增加字段时,要加上after关键字,否则会在te字段后面,造成同步失败。例:
alter table t1 add column address varchar(500) after name;

2、mysqldump工具不会导出历史数据,所以在做备份时,可以通过Percona XtraBackup热备份工具来备份物理文件。

3、搭建从库时,如果你用mysqldump工具,要先导出表结构文件,再导出数据。
1)只导出表结构:

# mysqldump -S /tmp/mysql3306.sock -uroot -p123456 --single-transaction --compact -c -d -q -B test > ./test_schema.sql

导入完表结构后,批量执行DDL转换系统版本表,脚本如下(附件里点击下载):

# cat convert.php
<?php

$conn=mysqli_connect("10.10.100.11","admin","123456","test","3306") or die("error connecting");
mysqli_query($conn,"SET NAMES utf8");

$table = "show tables";
$result1 = mysqli_query($conn,$table);
while($row = mysqli_fetch_array($result1)){
    $table_name=$row[0];
    echo "$table_name 表正在进行转换系统版本表。。。".PHP_EOL;
    $convert_table="
ALTER TABLE {$table_name} ADD COLUMN ts TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
              ADD COLUMN te TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
              ADD PERIOD FOR SYSTEM_TIME(ts, te),
              ADD SYSTEM VERSIONING";
    $result2=mysqli_query($conn,$convert_table);
    if($result2){
            echo '更改表结构成功.'.PHP_EOL;
          echo ''.PHP_EOL;
    }
    else{
            echo '更改表结构失败.'.PHP_EOL;
          echo ''.PHP_EOL;
    }
}

mysqli_close($conn);

?>

注:先安装php-mysql驱动
#yum install php php-mysql -y
#php convert.php

MariaDB10.3 系统版本表 有效防止数据丢失

2)只导出数据:

# mysqldump -S /tmp/mysql3306.sock -uroot -p123456 --single-transaction
--master-data=2 --compact -c -q -t -B test > test_data.sql

参考文档:
https://mariadb.com/kb/en/library/system-versioned-tables/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/637053e309234291c86180660558ad5c.html