@@ -27,105 +27,112 @@ TiDB 实现了通过标准 SQL 接口读取历史数据功能,无需特殊的
27
27
28
28
TiDB 使用 MVCC 管理版本,当更新/删除数据时,不会做真正的数据删除,只会添加一个新版本数据,所以可以保留历史数据。历史数据不会全部保留,超过一定时间的历史数据会被彻底删除,以减小空间占用以及避免历史版本过多引入的性能开销。
29
29
30
- 我们使用周期性运行的 GC (Garbage Collection, 垃圾回收)来进行清理,关于 GC 的详细介绍清参阅 [ TiDB 垃圾回收 (GC)] ( gc.md )
30
+ TiDB 使用周期性运行的 GC (Garbage Collection,垃圾回收)来进行清理,关于 GC 的详细介绍参见 [ TiDB 垃圾回收 (GC)] ( gc.md ) 。
31
31
32
- 这里我们需要重点关注的是 ` tikv_gc_life_time ` 和 ` tikv_gc_safe_point ` 这条。` tikv_gc_life_time ` 用于配置历史版本保留时间,可以手动修改;` tikv_gc_safe_point ` 记录了当前的 safePoint,用户可以安全地使用大于 safePoint 的时间戳创建 snapshot 读取历史版本。safePoint 在每次 GC 开始运行时自动更新。
32
+ 这里需要重点关注的是 ` tikv_gc_life_time ` 和 ` tikv_gc_safe_point ` 这条。` tikv_gc_life_time ` 用于配置历史版本保留时间,可以手动修改;` tikv_gc_safe_point ` 记录了当前的 safePoint,用户可以安全地使用大于 safePoint 的时间戳创建 snapshot 读取历史版本。safePoint 在每次 GC 开始运行时自动更新。
33
33
34
34
## 示例
35
35
36
- 初始化阶段,创建一个表,并插入几行数据:
37
-
38
- ``` sql
39
- mysql> create table t (c int );
40
- Query OK, 0 rows affected (0 .01 sec)
41
-
42
- mysql> insert into t values (1 ), (2 ), (3 );
43
- Query OK, 3 rows affected (0 .00 sec)
44
- ```
45
-
46
- 查看表中的数据:
47
-
48
- ```
49
- mysql> select * from t;
50
- +------+
51
- | c |
52
- +------+
53
- | 1 |
54
- | 2 |
55
- | 3 |
56
- +------+
57
- 3 rows in set (0.00 sec)
58
- ```
59
-
60
- 查看当前时间:
61
-
62
- ``` sql
63
- mysql> select now();
64
- + -- -------------------+
65
- | now() |
66
- + -- -------------------+
67
- | 2016 - 10 - 08 16 :45 :26 |
68
- + -- -------------------+
69
- 1 row in set (0 .00 sec)
70
- ```
71
-
72
- 更新某一行数据:
73
-
74
- ``` sql
75
- mysql> update t set c= 22 where c= 2 ;
76
- Query OK, 1 row affected (0 .00 sec)
77
- ```
78
-
79
- 确认数据已经被更新:
80
-
81
- ``` sql
82
- mysql> select * from t;
83
- + -- ----+
84
- | c |
85
- + -- ----+
86
- | 1 |
87
- | 22 |
88
- | 3 |
89
- + -- ----+
90
- 3 rows in set (0 .00 sec)
91
- ```
92
-
93
- 设置一个特殊的环境变量,这个是一个 session scope 的变量,其意义为读取这个时间之前的最新的一个版本。注意这里的时间设置的是 update 语句之前的那个时间:
94
-
95
- ``` sql
96
- mysql> set @@tidb_snapshot= " 2016-10-08 16:45:26" ;
97
- Query OK, 0 rows affected (0 .00 sec)
98
- ```
99
-
100
- 这里读取到的内容即为 update 之前的内容,也就是历史版本:
101
-
102
- ``` sql
103
- mysql> select * from t;
104
- + -- ----+
105
- | c |
106
- + -- ----+
107
- | 1 |
108
- | 2 |
109
- | 3 |
110
- + -- ----+
111
- 3 rows in set (0 .00 sec)
112
- ```
113
-
114
- 清空这个变量后,即可读取最新版本数据:
115
-
116
- ``` sql
117
- mysql> set @@tidb_snapshot= " " ;
118
- Query OK, 0 rows affected (0 .00 sec)
119
- ```
120
-
121
- ``` sql
122
- mysql> select * from t;
123
- + -- ----+
124
- | c |
125
- + -- ----+
126
- | 1 |
127
- | 22 |
128
- | 3 |
129
- + -- ----+
130
- 3 rows in set (0 .00 sec)
131
- ```
36
+ 1 . 初始化阶段,创建一个表,并插入几行数据:
37
+
38
+ ``` sql
39
+ mysql> create table t (c int );
40
+ Query OK, 0 rows affected (0 .01 sec)
41
+
42
+ mysql> insert into t values (1 ), (2 ), (3 );
43
+ Query OK, 3 rows affected (0 .00 sec)
44
+ ```
45
+
46
+ 2 . 查看表中的数据:
47
+
48
+ ` ` ` sql
49
+ mysql> select * from t;
50
+ +------+
51
+ | c |
52
+ +------+
53
+ | 1 |
54
+ | 2 |
55
+ | 3 |
56
+ +------+
57
+ 3 rows in set (0.00 sec)
58
+ ` ` `
59
+
60
+ 3 . 查看当前时间:
61
+
62
+ ` ` ` sql
63
+ mysql> select now();
64
+ +---------------------+
65
+ | now() |
66
+ +---------------------+
67
+ | 2016-10-08 16:45:26 |
68
+ +---------------------+
69
+ 1 row in set (0.00 sec)
70
+ ` ` `
71
+
72
+ 4 . 更新某一行数据:
73
+
74
+ ` ` ` sql
75
+ mysql> update t set c=22 where c=2;
76
+ Query OK, 1 row affected (0.00 sec)
77
+ ` ` `
78
+
79
+ 5 . 确认数据已经被更新:
80
+
81
+ ` ` ` sql
82
+ mysql> select * from t;
83
+ +------+
84
+ | c |
85
+ +------+
86
+ | 1 |
87
+ | 22 |
88
+ | 3 |
89
+ +------+
90
+ 3 rows in set (0.00 sec)
91
+ ` ` `
92
+
93
+ 6 . 设置一个特殊的环境变量,这个是一个 session scope 的变量,其意义为读取这个时间之前的最新的一个版本。
94
+
95
+ ` ` ` sql
96
+ mysql> set @@tidb_snapshot="2016-10-08 16:45:26";
97
+ Query OK, 0 rows affected (0.00 sec)
98
+ ` ` `
99
+
100
+ > ** 注意** :
101
+ >
102
+ > - 这里的时间设置的是 update 语句之前的那个时间。
103
+ > - 在 ` tidb_snapshot` 前须使用 ` @@` 而非 ` @` ,因为 ` @@` 表示全局变量,` @` 表示 Session 变量。
104
+
105
+ 这里读取到的内容即为 update 之前的内容,也就是历史版本:
106
+
107
+ ` ` ` sql
108
+ mysql> select * from t;
109
+ +------+
110
+ | c |
111
+ +------+
112
+ | 1 |
113
+ | 2 |
114
+ | 3 |
115
+ +------+
116
+ 3 rows in set (0.00 sec)
117
+ ` ` `
118
+
119
+ 7 . 清空这个变量后,即可读取最新版本数据:
120
+
121
+ ` ` ` sql
122
+ mysql> set @@tidb_snapshot="";
123
+ Query OK, 0 rows affected (0.00 sec)
124
+ ` ` `
125
+
126
+ ` ` ` sql
127
+ mysql> select * from t;
128
+ +------+
129
+ | c |
130
+ +------+
131
+ | 1 |
132
+ | 22 |
133
+ | 3 |
134
+ +------+
135
+ 3 rows in set (0.00 sec)
136
+ ` ` `
137
+
138
+ > ** 注意** :在 ` tidb_snapshot` 前须使用 ` @@` 而非 ` @` ,因为 ` @@` 表示全局变量,` @` 表示 Session 变量。
0 commit comments