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; 注意看紅色字體,這就是新增加的語法,字段ts和te是數(shù)據(jù)變化的起止時間和結(jié)束時間。
另外用ALTER TABLE更改表結(jié)構(gòu),語法如下:
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ù) 這里我們做一個實驗,首先要插入1條數(shù)據(jù),
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 '"' --- 字符串帶雙引號
導(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)版本表存儲了所有的歷史數(shù)據(jù),隨著時間的推移,歷史版本數(shù)據(jù)會變得越來越大,那么我們就可以將其最老的歷史數(shù)據(jù)刪除。 例:將p0分區(qū)刪除 ALTER TABLE t1 DROP PARTITION p0;
七、注意事項 1、參數(shù)system_versioning_alter_history要設(shè)置為KEEP(在my.cnf配置文件里寫死),否則默認不能執(zhí)行DDL修改表結(jié)構(gòu)操作。 set global system_versioning_alter_history = 'KEEP';
注:增加字段時,要加上after關(guān)鍵字,否則會在te字段后面,造成同步失敗。例: alter table t1 add column address varchar(500) after name;