天天看點

PXC 5.7 mysqldump: Error 2013

最近在mysqldump時,遭遇mysqldump: Error 2013錯誤。以為是常見的參數設定有問題,調整之後,也沒有任何成效。原來發生了OOM,以下是其具體描述。

一、故障現象

環境
# more /etc/redhat-release 
CentOS Linux release  (Core) 

# mysql -V           ##PXC 5.7
mysql  Ver  Distrib -, for Linux (x86_64) using  

# mysqldump -hlocalhost -uroot -p --port=33006 --default-character-set=utf8 -F -R -E --triggers -e  \
>  --single-transaction --all-databases >/tmp/alldb.sql
Enter password: 
mysqldump: Error : Lost connection to MySQL server during query when dumping table `tel_send_log` at row: 
表并不是很大,也就w左右的資料行。
           

二、故障分析

起初以為是相關變量設定有問題,是以調整相關參數
mysql > set global connect_timeout=;
mysql > set global net_read_timeout=;
mysql > set global net_write_timeout=;
mysql > set global max_allowed_packet=**;
mysql > set global net_buffer_length=*;

之後再次導出,問題依舊,而且報錯之後,mysqld就直接挂了
檢視mysqld的error log也未得到相關報錯的具體資訊,還以為是版本太新遭遇Bug呢
後來加上一個選項--skip-extended-insert(這個是不啟用mysql 生成insert包含多values)也不行
換到另一個節點後,導出卻是正常的。
于是打開報錯系統日志message一看,竟然out of memory

# tail -fn 50 /var/log/message
Apr  :: zcd kernel: Out of memory: Kill process  (firewalld) score  or sacrifice child
Apr  :: zcd kernel: Killed process  (firewalld) total-vm:kB, anon-rss:kB, file-rss:kB, shmem-rss:kB
Apr  :: zcd systemd: firewalld.service: main process exited, code=killed, status=/KILL
Apr  :: zcd mysqld_safe: /usr/bin/mysqld_safe: line :   Killed                
   nohup /usr/sbin/mysqld --basedir=/usr --datadir=/u02/pxcdata --plugin-dir=/usr/lib64/mysql/plugin --user=mysql 
  --wsrep-provider=/usr/lib64/galera3/libgalera_smm.so --log-error=/var/log/mysqld.log 
  --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=33006
  --wsrep_start_position=e12b32d1-06f1-11e8-b907-d7b0846b449d:68722 < /dev/null > /dev/null 2>&1
Apr  :: zcd mysqld_safe: --T07::Z mysqld_safe Number of processes running now: 
Apr  :: zcd mysqld_safe: --T07::Z mysqld_safe WSREP: not restarting wsrep node automatically
Apr  :: zcd mysqld_safe: --T07::Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

于是重新開機mysql,然後再次導出,觀察記憶體占用情況,如下,可以看到free列值不斷減少
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b  swpd  free  buff  cache  si  so    bi    bo  in  cs us sy id wa st
                                 
                                   
                                 
                                   
                                   
                                
                                 
                                 
                                  
                                  
                                 
                                
                                   

###三、故障解決
由于目前伺服器記憶體較小,也沒有配置交換分區,是以考慮為其添加交換分區。
再次導出觀察記憶體的使用情況。

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b  swpd  free  buff  cache  si  so    bi    bo  in  cs us sy id wa st
                                   
                                   
...............................................
                                  
                            
                            
                              
                            
                             
      ......................可以看到swpd的值不斷的增加,si的值也不斷增加............
                           
                            
                           
                           
                           
                           

--檢視交換分區使用情況
# cat /proc/meminfo|grep -i swap
SwapCached:       kB   -- Author : Leshami
SwapTotal:       kB   -- Blog : https://blog.csdn.net/leshami
SwapFree:         kB
--至此故障解決。
           

四、幾個參數描述

connect_timeout

  連接配接響應逾時時間。伺服器端在這個時間内如未連接配接成功,則會傳回連接配接失敗。

wait_timeout

  連接配接空閑逾時時間。與伺服器端無互動狀态的連接配接,直到被伺服器端強制關閉而等待的時間。

  可以認為是伺服器端連接配接空閑的時間,空閑超過這個時間将自動關閉。

interactive_timeout

  連接配接空閑逾時時間。與伺服器端無互動狀态的連接配接,直到被伺服器端強制關閉而等待的時間。

interactive_timeout和wait_timeoutu兩者差異

  interactive_timeout針對互動式連接配接(比如通過mysql用戶端連接配接資料庫),

  wait_timeout針對非互動式連接配接(比如一般在PHP中使用PDO連接配接資料庫,當然你可以設定CLIENT_INTERACTIVE選項來改變)。

  所謂的互動式連接配接,即在mysql_real_connect()函數中使用了CLIENT_INTERACTIVE選項。

net_read_timeout

  資料讀取逾時時間。在終止讀之前,從一個連接配接獲得資料而等待的時間秒數;

  當服務正在從用戶端讀取資料時,net_read_timeout控制何時逾時。

  即用戶端執行資料讀取,等待多少秒仍未執行成功時自動斷開連接配接。

net_write_timeout

  資料庫寫逾時時間。和net_read_timeout意義類似,在終止寫之前,等待多少秒把block寫到連接配接;

  當服務正在寫資料到用戶端時,net_write_timeout控制何時逾時。

slave-net-timeout

  從庫延後同步的時間,當slave認為連接配接master的連接配接有問題時,就等待N秒,然後斷開連接配接,

  重新連接配接masterslave-net-timeout在主從同步時從庫上起作用;

connect_timeout:在擷取連接配接階段起作用;

interactive_timeout和wait_timeout:在連接配接空閑階段起作用;

net_read_timeout和net_write_timeout:則是在連接配接執行時起作用。

max_allowed_packet

  一個資料包或任何生成/中間字元串的最大大小,設定過小時發出“資訊包過大”錯誤,并關閉連接配接

繼續閱讀