CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, `ts` timestamp(6) GENERATED ALWAYS AS ROW START, `te` timestamp(6) GENERATED ALWAYS AS ROW END, PRIMARY KEY (`id`,`te`), PERIOD FOR SYSTEM_TIME (`ts`, `te`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 WITH SYSTEM VERSIONING; 注意看紅色字體,這就是新增加的語(yǔ)法,字段ts和te是數(shù)據(jù)變化的起止時(shí)間和結(jié)束時(shí)間。
另外用ALTER TABLE更改表結(jié)構(gòu),語(yǔ)法如下:
ALTER TABLE t1 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; 二、查詢歷史數(shù)據(jù) 這里我們做一個(gè)實(shí)驗(yàn),首先要插入1條數(shù)據(jù),
語(yǔ)法一:查詢一小時(shí)內(nèi)的歷史數(shù)據(jù)。 SELECT * FROM t FOR SYSTEM_TIME BETWEEN (NOW() - INTERVAL 1 HOUR) AND NOW(); HOUR:小時(shí) MINUTE:分鐘 DAY:天 MONTH:月 YEAR:年
語(yǔ)法二:查詢一段時(shí)間內(nèi)的歷史數(shù)據(jù) SELECT * FROM t1 FOR SYSTEM_TIME FROM '2018-05-15 00:00:00' TO '2018-05-15 14:00:00';
語(yǔ)法三:查詢所有歷史數(shù)據(jù) SELECT * FROM t1 FOR SYSTEM_TIME ALL;
SELECT id,name FROM t1 FOR SYSTEM_TIME ALL where id = 1 AND name = '張三' into outfile '/tmp/t1.sql' / FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'; FIELDS TERMINATED BY ',' --- 字段的分隔符 OPTIONALLY ENCLOSED BY '"' --- 字符串帶雙引號(hào)
導(dǎo)入恢復(fù)
load data infile '/tmp/t1.sql' replace into table t1 / FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' / (id,name);
SELECT PARTITION_DESCRIPTION,TABLE_ROWS FROM `information_schema`.`PARTITIONS` WHERE table_schema='hcy' AND table_name='t1';
五、刪除舊的歷史數(shù)據(jù) 系統(tǒng)版本表存儲(chǔ)了所有的歷史數(shù)據(jù),隨著時(shí)間的推移,歷史版本數(shù)據(jù)會(huì)變得越來(lái)越大,那么我們就可以將其最老的歷史數(shù)據(jù)刪除。 例:將p0分區(qū)刪除 ALTER TABLE t1 DROP PARTITION p0;
七、注意事項(xiàng) 1、參數(shù)system_versioning_alter_history要設(shè)置為KEEP(在my.cnf配置文件里寫死),否則默認(rèn)不能執(zhí)行DDL修改表結(jié)構(gòu)操作。 set global system_versioning_alter_history = 'KEEP';
注:增加字段時(shí),要加上after關(guān)鍵字,否則會(huì)在te字段后面,造成同步失敗。例: alter table t1 add column address varchar(500) after name;