成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MariaDB 10.3首推系統版本表,誤刪數據不用跑路了!

數據庫 其他數據庫 MariaDB
同一行數據一秒內被更改了10次,那么系統版本表就會保存10份不同時間的版本數據。就像電影《源代碼》里的平行世界理論一樣,你可以退回任意時間里,從而有效保障你的數據是安全的。也就是說,DBA手抖或是程序BUG引起的數據丟失,在MariaDB 10.3里已然成為過去。

MariaDB 10.3首推系統版本表,誤刪數據不用跑路了!

系統版本表是SQL:2011標準中***引入的功能,它存儲所有更改的歷史數據,而不僅僅是當前時刻有效的數據。

舉個例子,同一行數據一秒內被更改了10次,那么系統版本表就會保存10份不同時間的版本數據。就像電影《源代碼》里的平行世界理論一樣,你可以退回任意時間里,從而有效保障你的數據是安全的。也就是說,DBA手抖或是程序BUG引起的數據丟失,在MariaDB 10.3里已然成為過去。

一、創建系統版本表

例子: 

  1. CREATE TABLE `t1` (  
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.   `namevarchar(100) DEFAULT NULL 
  4.   `ts` timestamp(6) GENERATED ALWAYS AS ROW START,  
  5.   `te` timestamp(6) GENERATED ALWAYS AS ROW END 
  6.   PRIMARY KEY (`id`,`te`),  
  7.   PERIOD FOR SYSTEM_TIME (`ts`, `te`)  
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 WITH SYSTEM VERSIONING; 

注意看紅色字體,這就是新增加的語法,字段ts和te是數據變化的起止時間和結束時間。

另外用ALTER TABLE更改表結構,語法如下: 

  1. ALTER TABLE t1 ADD COLUMN ts TIMESTAMP(6) GENERATED ALWAYS AS ROW START,  
  2.                            ADD COLUMN te TIMESTAMP(6) GENERATED ALWAYS AS ROW END 
  3.                            ADD PERIOD FOR SYSTEM_TIME(ts, te),  
  4.                            ADD SYSTEM VERSIONING; 

二、查詢歷史數據

這里我們做一個實驗,首先要插入一條數據,如下圖所示:

接著把姓名為“張三”,改成“李四”(誤更改數據):

現在數據已經成功變更,那么我想查看歷史數據怎么辦呢?非常簡單,一條命令搞定。

語法一:查詢一小時內的歷史數據。 

  1. SELECT * FROM t FOR SYSTEM_TIME BETWEEN (NOW() - INTERVAL 1 HOURAND NOW(); 

HOUR:小時

MINUTE:分鐘

DAY:天

MONTH:月

YEAR:年

語法二:查詢一段時間內的歷史數據。 

  1. SELECT * FROM t1 FOR SYSTEM_TIME FROM '2018-05-15 00:00:00' TO '2018-05-15 14:00:00'

語法三:查詢所有歷史數據。 

  1. SELECT * FROM t1 FOR SYSTEM_TIME ALL

三、恢復歷史數據

現在我們已經找到了歷史數據“張三”,只需把它導出來做恢復即可。 

  1. SELECT id,name FROM t1 FOR SYSTEM_TIME ALL where id = 1 AND name =   
  2. '張三' into outfile '/tmp/t1.sql' \  
  3. FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'

FIELDS TERMINATED BY ',' —— 字段的分隔符

OPTIONALLY ENCLOSED BY '"' —— 字符串帶雙引號 

導入恢復。 

  1. load data infile '/tmp/t1.sql' replace into table t1 \ 
  2.  
  3. FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' \ 
  4.  
  5. (id,name); 

非常簡單地恢復完數據,此方法比之前用mysqlbinlog或自研腳本等工具做閃回效率高得多。

四、單獨存儲歷史數據

當歷史數據與當前數據一起存儲時,勢必會增加表的大小,且當前的數據查詢:表掃描和索引搜索,將會花費更多時間,因為需要跳過歷史數據。那么我們可以通過表分區將其分開、單獨存儲,以減少版本控制的開銷。 

接上面的例子,執行下面的語句: 

  1. alter table t1   
  2.   PARTITION BY SYSTEM_TIME INTERVAL 1 MONTH (  
  3.     PARTITION p0 HISTORY,  
  4.     PARTITION p1 HISTORY,  
  5.     PARTITION p2 HISTORY,  
  6.     PARTITION p3 HISTORY,  
  7.     PARTITION p4 HISTORY,  
  8.     PARTITION p5 HISTORY,  
  9.     PARTITION p6 HISTORY,  
  10.     PARTITION pcur CURRENT  
  11.   ); 

意思是:按照月份分割歷史數據,今天至一個月后(2018年6月15日)的歷史數據放入p0分區,次月的歷史數據放入p1分區,依次類推至(2018年12月15日)存p6分區。當前數據存儲在pcur分區里。

可以通過數據字典表,來查看每個分區表的數據輪詢時間狀態信息。 

  1. SELECT PARTITION_DESCRIPTION,TABLE_ROWS FROM  
  2. `information_schema`.`PARTITIONS` WHERE table_schema='hcy' AND  
  3. table_name='t1'

五、刪除舊的歷史數據

系統版本表存儲了所有的歷史數據,隨著時間的推移,歷史版本數據會變得越來越大,那么我們就可以將其最老的歷史數據刪除。

例:將p0分區刪除 

  1. ALTER TABLE t1 DROP PARTITION p0; 

六、正確使用姿勢

通過上述介紹,我們了解了系統版本表的原理。但在高并發寫入場景下,勢必會帶來性能上的損失,所以要用正確的姿勢開啟該功能。

例:主庫是MySQL 5.6或者MariaDB 10.0/1/2版本,搭建一個新從庫MariaDB 10.3,在該從庫上轉換為系統版本控制表。這樣主庫上誤刪或誤篡改數據,可以在從庫上通過版本控制找回。 

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

七、注意事項

1、參數system_versioning_alter_history要設置為KEEP(在my.cnf配置文件里寫死),否則默認不能執行DDL修改表結構操作。 

  1. set global system_versioning_alter_history = 'KEEP'

注:增加字段時,要加上after關鍵字,否則會在te字段后面,造成同步失敗。例: 

  1. alter table t1 add column address varchar(500) after name

2、mysqldump工具不會導出歷史數據,所以在做備份時,可以通過Percona XtraBackup熱備份工具來備份物理文件。

3、搭建從庫時,如果你用mysqldump工具,要先導出表結構文件,再導出數據。

1)只導出表結構: 

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

導入完表結構后,批量執行DDL轉換系統版本表,腳本如下(點擊文末【閱讀原文】可下載腳本): 

  1. # cat convert.php  
  2.  
  3. <?php    
  4.  
  5. $conn=mysqli_connect("10.10.100.11","admin","123456","test","3306"or die("error connecting");  
  6. mysqli_query($conn,"SET NAMES utf8");  
  7.  
  8. $table = "show tables" 
  9. $result1 = mysqli_query($conn,$table);  
  10. while($row = mysqli_fetch_array($result1)){  
  11.     $table_name=$row[0];  
  12.     echo "$table_name 表正在進行轉換系統版本表。。。".PHP_EOL;  
  13.     $convert_table="  
  14. ALTER TABLE {$table_name} ADD COLUMN ts TIMESTAMP(6) GENERATED ALWAYS AS ROW START,  
  15.               ADD COLUMN te TIMESTAMP(6) GENERATED ALWAYS AS ROW END 
  16.               ADD PERIOD FOR SYSTEM_TIME(ts, te),  
  17.               ADD SYSTEM VERSIONING";  
  18.     $result2=mysqli_query($conn,$convert_table);  
  19.     if($result2){  
  20.             echo '更改表結構成功.'.PHP_EOL;  
  21.         echo ''.PHP_EOL;  
  22.     }  
  23.     else 
  24.             echo '更改表結構失敗.'.PHP_EOL;  
  25.         echo ''.PHP_EOL;  
  26.     }  
  27.  
  28.  
  29. mysqli_close($conn);  
  30.  
  31. ?> 

注:先安裝php-mysql驅動 

  1. # yum install php php-mysql -y  
  2. # php convert.php  

2) 只導出數據: 

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

4、對于DROP DATABASE和DROP TABLE,以及TRUNCATE TABLE等操作是無法通過上述方法閃回恢復數據的,切記!

請務必在生產環境,搭建延遲復制從庫,命令如下: 

  1. shell > perl /usr/local/bin/pt-slave-delay -S /tmp/mysql.sock --user root --password 123456  \  
  2. --delay 43200 --log /root/delay.log --daemonize 

注:單位秒,43200秒等于12小時。

參考文檔:

https://mariadb.com/kb/en/library/system-versioned-tables/ 

責任編輯:龐桂玉 來源: DBAplus社群
相關推薦

2009-12-17 16:38:20

正版免費詞典

2010-10-14 16:41:45

2018-09-21 11:17:54

數據庫

2015-05-29 09:01:48

2017-07-14 15:49:05

MongoDB誤刪表恢復步驟

2010-08-23 09:20:57

2024-03-25 00:03:00

生成式 AIAI

2011-06-17 09:20:35

MariaDB

2022-03-22 18:28:04

網絡大學跑路

2022-03-08 13:14:32

數據湖大數據

2023-07-26 13:17:04

數據表誤刪流程

2021-12-22 10:29:23

Prometheus elasticsear運維

2018-12-11 11:13:25

Linux系統恢復

2020-08-05 11:50:47

刪庫MySQL數據庫

2019-01-02 10:32:56

Linux系統文件運維

2014-03-10 17:56:33

浪潮大數據定制機

2015-06-23 11:34:39

2011-09-22 09:15:49

MariaDB數據庫

2024-12-17 08:30:01

2020-04-13 08:33:39

高并發秒殺系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧洲免费毛片 | www性色| 亚洲成网站 | 亚洲一区中文字幕 | 黄视频免费观看 | 日韩成人影院 | 99久久精品国产一区二区三区 | 男女羞羞视频网站 | 国产欧美一区二区三区在线看 | 久久另类 | 少妇黄色 | 中文字幕日韩专区 | 成人午夜高清 | 国产在线观看福利 | 日韩精品免费视频 | 国产精品日韩一区二区 | 一区二区在线 | 亚洲国产精品视频一区 | 欧美激情精品久久久久久免费 | 亚洲精品4 | 成人一区二区三区 | 午夜免费视频 | 无码国模国产在线观看 | 国产精品久久久久久吹潮 | 日韩免费福利视频 | 99久久电影 | 免费看片国产 | 国产精品一区二区久久 | 懂色tv| 精品免费观看 | 日韩中文字幕第一页 | 天天天操 | 久久国产区| 色视频网站 | 国产精品成人一区二区三区吃奶 | 婷婷激情在线 | 日日操视频 | 国产精品美女久久久久久免费 | 国产一区二区精华 | 91国产在线视频在线 | 一区二区三区久久久 |