成人免费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誤刪表恢復步驟

2024-03-25 00:03:00

生成式 AIAI

2010-08-23 09:20:57

2011-06-17 09:20:35

MariaDB

2022-03-22 18:28:04

網絡大學跑路

2022-03-08 13:14:32

數據湖大數據

2021-12-22 10:29:23

Prometheus elasticsear運維

2023-07-26 13:17:04

數據表誤刪流程

2020-08-05 11:50:47

刪庫MySQL數據庫

2018-12-11 11:13:25

Linux系統恢復

2019-01-02 10:32:56

Linux系統文件運維

2014-03-10 17:56:33

浪潮大數據定制機

2015-06-23 11:34:39

2020-04-13 08:33:39

高并發秒殺系統

2016-10-31 14:09:38

戴爾DIY服務器

2011-09-22 09:15:49

MariaDB數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美aⅴ | 免费黄色录像片 | av大片| 爱爱综合网 | 日韩成人免费 | 九九热免费视频在线观看 | 国产91av视频 | 久久精品国产99国产精品 | 毛片的网址| 91视频网 | 超碰97av| 亚洲自拍一区在线观看 | 国产综合精品 | 久久国产精品免费一区二区三区 | 国产精品美女久久久久久免费 | 久久中文字幕一区 | 看毛片的网站 | 成人天堂噜噜噜 | 一区二区三区中文字幕 | 精品欧美激情在线观看 | 久久一区二区三区四区 | 亚洲欧洲在线视频 | 久草99| 亚洲视频免费在线观看 | www.欧美视频 | 波波电影院一区二区三区 | 日韩手机在线视频 | 欧美国产视频 | 欧美一区二区综合 | 国产精品久久久久久久久久久免费看 | 欧美日韩一区二区三区四区 | 国产一区二区在线免费观看 | 欧美激情一区二区 | www.日韩高清 | 综合久久久久久久 | 欧美日韩1区2区 | 伊人免费在线 | www亚洲免费国内精品 | 日本一区二区高清不卡 | 亚洲国产精久久久久久久 | 国产精品资源在线 |