Binlog也是一套由TiDB提供備份與資料同步的工具。
資料同步的部分,就像他的名字一樣很容易聯想到MySQL的binlog,這方面功能也一樣。
但是官網的資料上寫著,使用上會遇到一些版本的限制,如果使用低於V5.0版本,會有部分功能不兼容的問題,V5.1版本以上就可以正常使用,所以啟用前應詳閱公開說明書。
Binlog主要有兩個角色,負責搜集TiDB產生的binlog並且依據transaction commit順序排序的Pump,以及由Pump搜集數據後,整合轉化成指定格式的Drainer。Pump可以組成cluster,防止機器故障時資料不見。
官方有提供部署binlog的yaml的範本,下面一樣擷取我做異動的部分。這邊精簡化部署,我各加一台Pump與Drainer,然後借用一下pd的機器...
server_configs:
tidb:
binlog.enable: true #打開binlog的開關
binlog.ignore-error: true #為了高可用,如果設定false,一旦binlog出了問題整個TiDB會停掉。
pump_servers:
- host: 10.102.1.92
drainer_servers:
- host: 10.102.1.195
config:
syncer.db-type: "mysql" #看你要同步到什麼地方 目前支援mysql、tidb、kafka、file
syncer.to.host: "10.102.1.34" #mysql的ip
syncer.to.user: "tidb_rep"
syncer.to.password: "密碼自己想"
syncer.to.port: 3306
接著在TiDB新增一個資料庫tidb_bin,新增一張表bin_test,然後寫入五筆資料,中間因為開的欄位太小所以做了一次schema的異動。
mysql> create database tidb_bin;
Query OK, 0 rows affected (0.52 sec)
mysql> use tidb_bin;
Database changed
mysql> create table bin_test(id int,act varchar(5));
Query OK, 0 rows affected (0.52 sec)
mysql> insert into bin_test(id,act) values(1,'CREATE');
ERROR 1406 (22001): Data too long for column 'act' at row 1
mysql> ALTER table bin_test modify colmun act varchar(10);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 38 near "act varchar(10)"
mysql> ALTER table bin_test modify column act varchar(10);
Query OK, 0 rows affected (0.51 sec)
mysql> insert into bin_test(id,act) values(1,'CREATE');
Query OK, 1 row affected (0.02 sec)
mysql> insert into bin_test(id,act) values(2,'INSERT');
Query OK, 1 row affected (0.01 sec)
mysql> insert into bin_test(id,act) values(3,'UPDATE');
Query OK, 1 row affected (0.00 sec)
mysql> insert into bin_test(id,act) values(4,'DELETE');
Query OK, 1 row affected (0.01 sec)
mysql> insert into bin_test(id,act) values(5,'SELECT');
Query OK, 1 row affected (0.01 sec)
這時候發現MySQL只同步到新增Table,沒有寫入資料,原來是我漏了加上權限做schema異動。
帳號所需的權限有Insert、Update、Delete、Create、Drop、Alter、Execute、Index、Select。
所以把帳號加上ALTER權限後,再撈一次DB發現有值了。
mysql> select * from tidb_bin.bin_test;
+------+--------+
| id | act |
+------+--------+
| 2 | INSERT |
| 5 | SELECT |
| 1 | CREATE |
| 3 | UPDATE |
| 4 | DELETE |
+------+--------+
5 rows in set (0.00 sec)