RDS最佳實踐(五)—Mysql大欄位的頻繁更新導致binlog暴增
背景:RDS Mysql採用的binlog 格式預設為ROW,在Mysql 5.6的版本之前,Mysql每次列的修改(update)都需要記錄表中所有列的值。這樣就存在一個問題,如果表中包含很多的大欄位,表的單行長度就會非常長,這樣每次update就會導致大量的 binlog空間生成。針對這個問題,在mysql 5.6中進行了改進,複製支援”row image control” ,只記錄修改的列而不是行中所有的列,這對一些包含 BLOGs 欄位的資料來說可以節省很大的處理能力,因此此項改進不僅節省了磁碟空間,同時也提升了效能:
-
binlog_row_image Before image After image minimal – All columns where a value was specified, and the autoincrement column if there is one noblob – All columns where a value was specified, and the autoincrement column if there is one, and all non-blob columns full – All columns
測試如下:
mysql> show global variables like ‘%binlog_row_image%’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| binlog_row_image | FULL |
+——————+——-+
CREATE TABLE `t_text_56` (
`id` int(11) NOT NULL DEFAULT ‘0’,
`c1` text,
`c2` text,
`c3` text,
`c4` text,
`c5` text,
`gmt_modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into t_text_56 values (3,repeat(‘test_text’,500),repeat(‘test_text’,500),repeat(‘test_text’,500),repeat(‘test_text’,500),repeat(‘test_text’,500),now());
表的單行記錄是16K:
mysql> show table status like ‘%tex%’G;
*************************** 1. row ***************************
Name: t_text_56
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1
Avg_row_length: 16384
Data_length: 16384
進行一次update操作:
update t_text_56 set gmt_modified=now() where id=3;
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @2=’test_texttest……………..’/* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @3=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @4=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @5=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @6=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @7=’2014-08-04 22:32:54′ /* DATETIME(0) meta=0 nullable=1 is_null=0 */
### SET
### @1=3 /* INT meta=0 nullable=1 is_null=0 */
### @2=’test_texttest……………..’/* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @3=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @4=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @5=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @6=’test_texttest……………..’ /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @7=’2014-08-04 22:32:58′ /* DATETIME(0) meta=0 nullable=1 is_null=0 */
5.6新增的binlog_row_image引數:minimal
mysql> set global binlog_row_image=minimal;
Query OK, 0 rows affected (0.00 sec)
mysql> update t_text_56 set gmt_modified=now() where id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
### UPDATE `test`.`t_text_56`
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### SET
### @7=’2014-08-04 22:33:32′ /* DATETIME(0) meta=0 nullable=1 is_null=0 */
binlog_row_image引數:NOLOB
mysql> set global binlog_row_image=noblob;
mysql> alter table t_text_56 add column gmt_create datetime;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> update t_text_56 set gmt_create=now() where id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
### UPDATE `test`.`t_text_56`
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @7=’2014-08-04 22:41:22′ /* DATETIME(0) meta=0 nullable=1 is_null=0 */
### @8=NULL /* DATETIME(0) meta=0 nullable=1 is_null=1 */
### SET
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @7=’2014-08-04 22:41:22′ /* DATETIME(0) meta=0 nullable=1 is_null=0 */
### @8=’2014-08-04 22:43:44′ /* DATETIME(0) meta=0 nullable=1 is_null=0 */
可以看到,mysql 5.6中binlog_row_image:
當設定為minimal時候,binlog只記錄了要修改的列的記錄;
當設定為nolob的時候,在minimal的基礎上binlog中加上非lob欄位;
當binlog_row_image預設設定為了full,與5.5,5.1的日誌格式保持一致,binlog記錄上有的行記錄資訊;
所以在5.6中binlog_row_image設定為minimal,這樣就可以大大減小了binlog的長度,進而減少了空間的使用。
敬請大家期待RDS 5.6的上線。
相關文章
- MySQL · 最佳實踐 · 如何索引 JSON 欄位 (阿里雲 RDS-資料庫核心組 )MySql索引JSON阿里資料庫
- RDS MySQL引數調優最佳實踐MySql
- 如何處理頻繁建立物件然後丟棄導致頻繁GC的情況物件GC
- MySQL 最佳實踐: RDS 只讀例項延遲分析MySql
- crontab導致的頻繁傳送郵件的問題
- 配置了Fast Recovery Area可能會導致snapshot controlfile被頻繁更新AST
- 阿里雲RDS PG最佳實踐阿里
- SQLServer的tempdb暴增導致磁碟消耗的處理方案SQLServer
- MySQL如何通過分析binlog日誌找出操作頻繁的表MySql
- MySQL多列欄位去重的案例實踐MySql
- logback配置不當導致頻繁類載入
- Mybatis plus通用欄位自動填充的最佳實踐總結MyBatis
- aix上跑oracle,swap頻繁導致hdisk100%繁忙AIOracle
- 【MySQL】一條SQL使磁碟暴漲並導致MySQL CrashMySql
- MySQL 大欄位問題MySql
- ORACLE中seq$表更新頻繁的分析Oracle
- 暴增 Emacs 生產力的十大最佳外掛Mac
- 線上排查:記憶體異常使用導致full gc頻繁記憶體GC
- 高德車載導航的差分更新最佳化實踐
- 又抓了一個導致頻繁GC的鬼--陣列動態擴容GC陣列
- 記錄一次因 mysql 欄位取名不規範導致的問題MySql
- oracle和mysql設定自增欄位OracleMySql
- WPF頻繁更新UI卡頓問題UI
- MySQL 更新同一個表不同欄位MySql
- MyBatis實現MySQL表欄位及結構的自動增刪MyBatisMySql
- 一次對pool的誤用導致的.net頻繁gc的診斷分析GC
- 事件風暴 - 分解問題領域的最佳實踐事件
- ORACLE SQL調優之統計資訊缺失導致的邏輯讀暴增OracleSQL
- 一種hive的模型設計思路,解決頻繁增加指標欄位的問題Hive模型指標
- MySQL 升級的最佳實踐MySql
- Android 底部導航欄 (底部 Tab) 最佳實踐|掘金技術徵文Android
- MySQL 更新一個表裡的欄位等於另一個表某欄位的值MySql
- iOS系統中導航欄的轉場解決方案與最佳實踐iOS
- 【Mongo】mongo更新欄位為另一欄位的值Go
- 基於 MySQL Binlog 的 Elasticsearch 資料同步實踐MySqlElasticsearch
- OGG相關的CPATURE導致SYSAUX表空間異常暴增處理UX
- MySQL:MGR修改max_binlog_cache_size引數導致異常MySql
- 光纖交換機埠模組更換導致資料庫IO頻繁100%資料庫