溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫中load data語句怎么保證主備復制數據一致性

發布時間:2021-10-29 16:58:57 來源:億速云 閱讀:166 作者:小新 欄目:MySQL數據庫

小編給大家分享一下數據庫中load data語句怎么保證主備復制數據一致性,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

  • 背景

    • 機器配置
      * CPU:16 vcpus
      * 磁盤:100G flash卡 data&binlog混用
      * 內存:64G

    • 數據庫版本:MySQL 5.7.18

    • 數據庫IP信息:主庫IP 10.10.30.241,從庫IP 10.10.30.250

    • 數據庫參數配置:
      * 主庫:雙一,log_slave_updates,log-bin,secure_file_priv='',server-id=3306241,binlog_rows_query_log_events=ON,sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
      * 從庫:雙一,log_slave_updates,log-bin,binlog_rows_query_log_events=ON,server-id=3306250,sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

    • 測試目的:通過示例演示并查看過程中binlog中如何記錄load data語句等方式來驗證 load data語句如何保證主備復制數據一致性
      * 將分別在四種隔離級別下(會話級別修改tx_isolation)針對binlog_format(會話級別修改binlog_format)的三種格式分別進行演示執行load data語句,觀察MySQL server層如何處理,主庫binlog中如何記錄load data語句,備庫的binlog中如何如何記錄load data語句
      * 本文假定你已經搭建好了主備復制環境,如果未搭建請先自行搭建主備復制環境

    • PS:本文僅針對測試目的做驗證演示,關于binlog_format三種格式以及事務的四種隔離級別詳細說明請查閱相關資料,本文不做解讀
      * binlog_format參考資料:https://dev.mysql.com/doc/refman/5.7/en/replication-formats.html
      * 事務隔離級別參考資料:https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html

1、制造測試數據

  • 建庫

admin@localhost : (none) 07:34:39> create database if not exists xiaoboluo;  
					
						Query OK, 1 row affected (0.00 sec) 					
  • 建表

admin@localhost : (none) 10:04:52> use xiaoboluo  
					
						Database changed					
						admin@localhost : xiaoboluo 10:04:57> create table if not exists test_load(id int unsigned not null primary key auto_increment,test varchar(100)); 
					
						Query OK, 0 rows affected (0.01 sec) 					
  • 插入測試數據

admin@localhost : xiaoboluo 10:05:32> insert into test_load(test) values('1'),('2'),('null'),('4');  
					
						Query OK, 4 rows affected (0.01 sec) 
					
						Records: 4 Duplicates: 0 Warnings: 0					
						 					
						 					
						admin@localhost : xiaoboluo 10:06:01> select * from test_load; 
					+----+------+ 
					| id | test | 
					+----+------+ 
					| 2 | 1 | 
					| 4 | 2 | 
					| 6 | null | 
					| 8 | 4 | 
					+----+------+ 
					
						4 rows in set (0.00 sec) 					
  • 執行select …into outifile語句生成load data需要的數據文本文件

admin@localhost : xiaoboluo 10:12:41> select * from test_load into outfile "/tmp/test_load.txt";  
					
						Query OK, 4 rows affected (0.01 sec) 
					
						 					
						 					
						admin@localhost : xiaoboluo 10:12:42> system cat /tmp/test_load.txt; 
					
						2 1					
						4 2					
						6 null					
						8 4					

2、read-uncommitted隔離級別

2.1. binlog_format=statement
  • 先在主庫中把binlog_format修改為statement,隔離級別修改為read-uncommitted,并刷新主從庫binlog

# 主庫  
					
						admin@localhost : xiaoboluo 09:37:09> set binlog_format=statement; 
					
						Query OK, 0 rows affected (0.00 sec) 
					
						 					
						 					
						admin@localhost : xiaoboluo 09:39:24> set tx_isolation='read-uncommitted'; 
					
						Query OK, 0 rows affected (0.00 sec) 
					
						 					
						 					
						admin@localhost : xiaoboluo 09:39:44> flush binary logs; 
					
						Query OK, 0 rows affected (0.01 sec) 
					
						 					
						 					
						# 從庫					
						mysql> flush binary logs; 
					
						Query OK, 0 rows affected (0.01 sec) 
					
						 					
						 					
						mysql> 					
  • 主庫清空表test_load并執行load data語句

admin@localhost : xiaoboluo 09:39:54> truncate test_load;  
					
						Query OK, 0 rows affected (0.00 sec) 
					
						admin@localhost : xiaoboluo 09:41:13> load data infile '/tmp/test_load.txt' into table test_load; 
					
						ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED. 
					
						Error (Code 1665): Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED. 
					
						Error (Code 1015): Can					
  • 從以上結果中可以看到,在RU隔離級別下,binlog_format設置為statement不允許load data語句執行,從報錯信息上可以看到,在RC和RU隔離級別下,binlog只能以row格式記錄,所以statement無法記錄binlog

  • 查看主庫表test_load中的數據

admin@localhost : xiaoboluo 09:41:52> select * from test_load;  
					
						Empty set (0.00 sec) 					
  • 從以上結果中可以看到,表數據并沒有導入成功,現在解析binlog查看一下

[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# ll  
					
						total 196					-rw-r----- 1 mysql mysql 4916 May 4 00:11 mysql-bin.000014					
						 					-rw-r----- 1 mysql mysql 4557 May 4 00:12 mysql-bin.000015					-rw-r----- 1 mysql mysql 5595 May 4 09:39 mysql-bin.000016					-rw-r----- 1 mysql mysql 366 May 4 09:41 mysql-bin.000017					-rw-r----- 1 mysql mysql 884 May 4 09:39 mysql-bin.index					[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# mysqlbinlog -vvv --base64-output=decode-rows mysql-bin.000017					...... 
					
						use `xiaoboluo`/*!*/; 
					...... 
					
						truncate test_load					
						/*!*/; 
					
						SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; 
					
						DELIMITER ; 
					
						# End of log file					...... 					
  • 從上面的結果中可以看到,解析binlog的結果中除了use db和truncate table語句之外,沒有其他的操作了,說明并沒有數據寫入,load data語句被mysql server直接拒絕執行了

2.2. binlog_format=mixed
  • 先在主庫中把binlog_format修改為mixed,隔離級別不要動,并刷新主從庫binlog

# 主庫  
					
						admin@localhost : xiaoboluo 09:44:05> set binlog_format=mixed; 
					
						Query OK, 0 rows affected (0.00 sec) 
					
						 					
						 					
						admin@localhost : xiaoboluo 09:49:49> flush binary logs; 
					
						Query OK, 0 rows affected (0.01 sec) 
					
						 					
						 					
						# 從庫					
						mysql> flush binary logs; 
					
						Query OK, 0 rows affected (0.01 sec) 
					
						 					
						 					
						mysql> 					
  • 主庫清空表test_load并執行load data語句

admin@localhost : xiaoboluo 09:49:57> truncate test_load;  
					
						Query OK, 0 rows affected (0.01 sec) 
					
						 					
						 					
						admin@localhost : xiaoboluo 09:51:12> load data infile '/tmp/test_load.txt' into table test_load; 
					
						Query OK, 4 rows affected (0.00 sec) 
					
						Records: 4 Deleted: 0 Skipped: 0 Warnings: 0					
  • 從以上結果中可以看到,在RU隔離級別下,binlog_format設置為mixed允許load data語句執行

  • 查看主庫表test_load中的數據

admin@localhost : xiaoboluo 09:51:24> select * from test_load;  
					+----+------+ 
					| id | test | 
					+----+------+ 
					| 2 | 1 | 
					| 4 | 2 | 
					| 6 | null | 
					| 8 | 4 | 
					+----+------+ 
					
						4 rows in set (0.00 sec) 					
  • 從以上結果中可以看到,表數據導入成功,現在解析binlog查看一下

[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# ll  
				
					total 196				-rw-r----- 1 mysql mysql 4916 May 4 00:11 mysql-bin.000014				-rw-r----- 1 mysql mysql 4557 May 4 00:12 mysql-bin.000015				-rw-r----- 1 mysql mysql 5595 May 4 09:39 mysql-bin.000016				-rw-r----- 1 mysql mysql 366 May 4 09:41 mysql-bin.000017				-rw-r----- 1 mysql mysql 744 May 4 09:51 mysql-bin.000018				-rw-r----- 1 mysql mysql 936 May 4 09:49 mysql-bin.index				[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000018				
					# at 259				
					#170504  9:51:12 server id 3306241  end_log_pos 354 CRC32 0xff83f0ce Query thread_id=155 exec_time=0 error_code=0				
					use `xiaoboluo`/*!*/; 
				...... 
				
					truncate test_load				...... 
				
					BEGIN				
					/*!*/; 
				
					# at 501				
					#170504  9:51:24 server id 3306241  end_log_pos 583 CRC32 0xfef1767a Rows_query				
					# load data infile '/tmp/test_load.txt' into table test_load  # 這里可以看到load data語句在這里,這里是開啟了參數binlog_rows_query_log_events=ON之后記錄的原生sql,默認被加了注釋,主備復制不會執行				
					# at 583				
					#170504  9:51:24 server id 3306241  end_log_pos 643 CRC32 0x349b62a4 Table_map: `xiaoboluo`.`test_load` mapped to number 340				
					# at 643				
					#170504  9:51:24 server id 3306241  end_log_pos 713 CRC32 0x4ceacc10 Write_rows: table id 340 flags: STMT_END_F				
					### INSERT INTO `xiaoboluo`.`test_load`  #這里是用于主備復制的數據變更日志,可以看到在mixed格式下被轉換為了row格式				
					### SET				
					###   @1=2 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='1' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=4 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='2' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=6 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='null' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=8 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='4' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					# at 713				
					#170504  9:51:24 server id 3306241  end_log_pos 744 CRC32 0xfa76965b Xid = 1237				
					COMMIT/*!*/; 
				
					SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; 
				
					DELIMITER ; 
				
					# End of log file				
					/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; 
				
					/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/ 				
  • 從上面解析binlog的結果中可以看到,數據寫入成功,load data語句被轉換為row格式記錄在binlog中

  • 查看備庫中數據是否正確復制

mysql> use xiaoboluo  
					
						Reading table information for completion of table and column names					
						You can turn off this feature to get a quicker startup with -A					
						 					
						 					
						Database changed					
						mysql> select * from test_load; 
					+----+------+ 
					| id | test | 
					+----+------+ 
					| 2 | 1 | 
					| 4 | 2 | 
					| 6 | null | 
					| 8 | 4 | 
					+----+------+ 
					
						4 rows in set (0.00 sec) 					
  • 解析備庫binlog中是如何記錄的load data語句

[root@e710d318-d5b4-4bc7-a606-d09f06ff5f5d binlog]# ll  
				
					total 100				-rw-r----- 1 mysql mysql 990 May 1 01:36 mysql-bin.000001				-rw-r----- 1 mysql mysql 54766 May 4 00:02 mysql-bin.000002				-rw-r----- 1 mysql mysql 21376 May 4 09:40 mysql-bin.000003				-rw-r----- 1 mysql mysql 401 May 4 09:50 mysql-bin.000004				-rw-r----- 1 mysql mysql 730 May 4 09:51 mysql-bin.000005				-rw-r----- 1 mysql mysql 260 May 4 09:50 mysql-bin.index				[root@e710d318-d5b4-4bc7-a606-d09f06ff5f5d binlog]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000005				... 
				
					#170504  9:51:12 server id 3306241  end_log_pos 354 CRC32 0xff83f0ce Query thread_id=155 exec_time=0 error_code=0				
					use `xiaoboluo`/*!*/; 
				... 
				
					truncate test_load				... 
				
					BEGIN				
					/*!*/; 
				
					# at 487				
					#170504  9:51:24 server id 3306241  end_log_pos 569 CRC32 0x67a31998 Rows_query				
					# load data infile '/tmp/test_load.txt' into table test_load  # 這里可以看到load data語句在這里,這里是開啟了參數binlog_rows_query_log_events=ON之后記錄的原生sql,默認被加了注釋,主備復制不會執行				
					# at 569				
					#170504  9:51:24 server id 3306241  end_log_pos 629 CRC32 0x6420d19b Table_map: `xiaoboluo`.`test_load` mapped to number 301				
					# at 629				
					#170504  9:51:24 server id 3306241  end_log_pos 699 CRC32 0xf5fff0d8 Write_rows: table id 301 flags: STMT_END_F				
					### INSERT INTO `xiaoboluo`.`test_load`  #這里是備庫記錄的主庫binlog日志,可以看到在mixed格式下被轉換為了row格式				
					### SET				
					###   @1=2 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='1' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=4 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='2' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=6 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='null' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=8 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='4' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					# at 699				
					#170504  9:51:24 server id 3306241  end_log_pos 730 CRC32 0xd5a3bda4 Xid = 424				
					COMMIT/*!*/; 
				... 				
2.3. binlog_format=row
  • 先在主庫中把binlog_format修改為row,隔離級別不要動,并刷新主從庫binlog

# 主庫  
				
					admin@localhost : xiaoboluo 11:05:20> set binlog_format=row; 
				
					Query OK, 0 rows affected (0.00 sec) 
				
					admin@localhost : xiaoboluo 11:18:23> flush binary logs; 
				
					Query OK, 0 rows affected (0.01 sec) 
				
					# 從庫				
					mysql> flush binary logs; 
				
					Query OK, 0 rows affected (0.01 sec) 
				
					mysql> 				
  • 主庫清空表test_load并執行load data語句

admin@localhost : xiaoboluo 11:18:26> truncate test_load;  
					
						Query OK, 0 rows affected (0.01 sec) 
					
						admin@localhost : xiaoboluo 11:18:51> load data infile '/tmp/test_load.txt' into table test_load; 
					
						Query OK, 4 rows affected (0.00 sec) 
					
						Records: 4 Deleted: 0 Skipped: 0 Warnings: 0					
  • 從以上結果中可以看到,在RU隔離級別下,binlog_format設置為row允許load data語句執行

  • 查看主庫表test_load中的數據

admin@localhost : xiaoboluo 11:18:57> select * from test_load;  
					+----+------+ 
					| id | test | 
					+----+------+ 
					| 2 | 1 | 
					| 4 | 2 | 
					| 6 | null | 
					| 8 | 4 | 
					+----+------+ 
					
						4 rows in set (0.00 sec) 					
  • 從以上結果中可以看到,表數據導入成功,現在解析binlog查看一下

[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# ll  
				
					total 196				-rw-r----- 1 mysql mysql 4916 May 4 00:11 mysql-bin.000014				-rw-r----- 1 mysql mysql 4557 May 4 00:12 mysql-bin.000015				-rw-r----- 1 mysql mysql 5595 May 4 09:39 mysql-bin.000016				-rw-r----- 1 mysql mysql 366 May 4 09:41 mysql-bin.000017				-rw-r----- 1 mysql mysql 744 May 4 09:51 mysql-bin.000018				-rw-r----- 1 mysql mysql 744 May 4 11:18 mysql-bin.000019				-rw-r----- 1 mysql mysql 988 May 4 11:18 mysql-bin.index				[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000018				
					# at 259				
					#170504 11:18:51 server id 3306241  end_log_pos 354 CRC32 0x9d5985ad Query thread_id=155 exec_time=0 error_code=0				
					use `xiaoboluo`/*!*/; 
				...... 
				
					truncate test_load				...... 
				
					BEGIN				
					/*!*/; 
				
					# at 501				
					#170504 11:18:57 server id 3306241  end_log_pos 583 CRC32 0x0e8f7603 Rows_query				
					# load data infile '/tmp/test_load.txt' into table test_load # 這里可以看到load data語句在這里,這里是開啟了參數binlog_rows_query_log_events=ON之后記錄的原生sql,默認被加了注釋,主備復制不會執行				
					# at 583				
					#170504 11:18:57 server id 3306241  end_log_pos 643 CRC32 0xe1c5d4d0 Table_map: `xiaoboluo`.`test_load` mapped to number 341				
					# at 643				
					#170504 11:18:57 server id 3306241  end_log_pos 713 CRC32 0x31619df3 Write_rows: table id 341 flags: STMT_END_F				
					### INSERT INTO `xiaoboluo`.`test_load`   #這里是用于主備復制的數據變更日志,可以看到在row格式下被轉換為了row格式				
					### SET				
					###   @1=2 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='1' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=4 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='2' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=6 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='null' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					### INSERT INTO `xiaoboluo`.`test_load`				
					### SET				
					###   @1=8 /* INT meta=0 nullable=0 is_null=0 */ 
				
					###   @2='4' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
				
					# at 713				
					#170504 11:18:57 server id 3306241  end_log_pos 744 CRC32 0x18b14b52 Xid = 1245				
					COMMIT/*!*/; 
				...... 				
  • 從上面解析binlog的結果中可以看到,數據寫入成功,load data語句被轉換為row格式記錄在binlog中

  • 查看備庫中數據是否正確復制

[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# ll  
					
						total 196					-rw-r----- 1 mysql mysql 4916 May 4 00:11 mysql-bin.000014					
						 					-rw-r----- 1 mysql mysql 4557 May 4 00:12 mysql-bin.000015					-rw-r----- 1 mysql mysql 5595 May 4 09:39 mysql-bin.000016					-rw-r----- 1 mysql mysql 366 May 4 09:41 mysql-bin.000017					-rw-r----- 1 mysql mysql 744 May 4 09:51 mysql-bin.000018					
						 					-rw-r----- 1 mysql mysql 744 May 4 11:18 mysql-bin.000019					-rw-r----- 1 mysql mysql 988 May 4 11:18 mysql-bin.index					
						 					
						 					[root@5f1772e3-0c7a-4537-97f9-9b57cf6a04c2 binlog]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000018					
						# at 259					
						#170504 11:18:51 server id 3306241  end_log_pos 354 CRC32 0x9d5985ad Query thread_id=155 exec_time=0 error_code=0					
						use `xiaoboluo`/*!*/; 
					...... 
					
						truncate test_load					...... 
					
						BEGIN					
						/*!*/; 
					
						# at 501					
						#170504 11:18:57 server id 3306241  end_log_pos 583 CRC32 0x0e8f7603 Rows_query					
						# load data infile '/tmp/test_load.txt' into table test_load # 這里可以看到load data語句在這里,這里是開啟了參數binlog_rows_query_log_events=ON之后記錄的原生sql,默認被加了注釋,主備復制不會執行					
						# at 583					
						#170504 11:18:57 server id 3306241  end_log_pos 643 CRC32 0xe1c5d4d0 Table_map: `xiaoboluo`.`test_load` mapped to number 341					
						# at 643					
						#170504 11:18:57 server id 3306241  end_log_pos 713 CRC32 0x31619df3 Write_rows: table id 341 flags: STMT_END_F					
						### INSERT INTO `xiaoboluo`.`test_load`   #這里是用于主備復制的數據變更日志,可以看到在row格式下被轉換為了row格式					
						### SET					
						###   @1=2 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='1' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						### INSERT INTO `xiaoboluo`.`test_load`					
						### SET					
						###   @1=4 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='2' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						### INSERT INTO `xiaoboluo`.`test_load`					
						### SET					
						###   @1=6 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='null' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						### INSERT INTO `xiaoboluo`.`test_load`					
						### SET					
						###   @1=8 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='4' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						# at 713					
						#170504 11:18:57 server id 3306241  end_log_pos 744 CRC32 0x18b14b52 Xid = 1245					
						COMMIT/*!*/; 
					...... 
					mysql> use xiaoboluo  
					
						Database changed					
						mysql> select * from test_load; 
					+----+------+ 
					| id | test | 
					+----+------+ 
					| 2 | 1 | 
					| 4 | 2 | 
					| 6 | null | 
					| 8 | 4 | 
					+----+------+ 
					
						4 rows in set (0.00 sec) 					
  • 解析備庫binlog中是如何記錄的load data語句

[root@e710d318-d5b4-4bc7-a606-d09f06ff5f5d binlog]# ll  
					
						total 100					-rw-r----- 1 mysql mysql 990 May 1 01:36 mysql-bin.000001					-rw-r----- 1 mysql mysql 54766 May 4 00:02 mysql-bin.000002					-rw-r----- 1 mysql mysql 21376 May 4 09:40 mysql-bin.000003					-rw-r----- 1 mysql mysql 401 May 4 09:50 mysql-bin.000004					-rw-r----- 1 mysql mysql 730 May 4 09:51 mysql-bin.000005					-rw-r----- 1 mysql mysql 730 May 4 11:18 mysql-bin.000006					-rw-r----- 1 mysql mysql 312 May 4 11:18 mysql-bin.index					[root@e710d318-d5b4-4bc7-a606-d09f06ff5f5d binlog]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000009					...... 
					
						# at 259					
						#170504 11:18:51 server id 3306241  end_log_pos 354 CRC32 0x9d5985ad Query thread_id=155 exec_time=0 error_code=0					
						use `xiaoboluo`/*!*/; 
					...... 
					
						truncate test_load					...... 
					
						# at 487					
						#170504 11:18:57 server id 3306241  end_log_pos 569 CRC32 0x97dd19e1 Rows_query					
						# load data infile '/tmp/test_load.txt' into table test_load  # 這里可以看到load data語句在這里,這里是開啟了參數binlog_rows_query_log_events=ON之后記錄的原生sql,默認被加了注釋,主備復制不會執行					
						# at 569					
						#170504 11:18:57 server id 3306241  end_log_pos 629 CRC32 0x6bef4f90 Table_map: `xiaoboluo`.`test_load` mapped to number 302					
						# at 629					
						#170504 11:18:57 server id 3306241  end_log_pos 699 CRC32 0x5a86b7f1 Write_rows: table id 302 flags: STMT_END_F					
						### INSERT INTO `xiaoboluo`.`test_load`  #這里是備庫記錄的主庫binlog日志,可以看到在row格式下被轉換為了row格式,與mixed格式下記錄的內容相同					
						### SET					
						###   @1=2 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='1' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						### INSERT INTO `xiaoboluo`.`test_load`					
						### SET					
						###   @1=4 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='2' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						### INSERT INTO `xiaoboluo`.`test_load`					
						### SET					
						###   @1=6 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='null' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						### INSERT INTO `xiaoboluo`.`test_load`					
						### SET					
						###   @1=8 /* INT meta=0 nullable=0 is_null=0 */ 
					
						###   @2='4' /* VARSTRING(300) meta=300 nullable=1 is_null=0 */ 
					
						# at 699					
						#170504 11:18:57 server id 3306241  end_log_pos 730 CRC32 0x983a4a33 Xid = 440					
						COMMIT/*!*/; 
					...... 					

看完了這篇文章,相信你對“數據庫中load data語句怎么保證主備復制數據一致性”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女