邏輯匯入匯出和max-allowed-packet的關係

psufnxk2000發表於2015-10-23
mysqldump和max-allowed-packet的測試:
匯入和匯出都包括


環境準備:
庫中有表:

mysql> select table_schema,data_length/1024/1024 from information_schema.tables where table_name='plugindata';
+--------------+-----------------------+
| table_schema | data_length/1024/1024 |
+--------------+-----------------------+
| t            |           39.51562500 |
| t1           |           61.51562500 |
+--------------+-----------------------+
2 rows in set (0.00 sec)
表中包含了longblob欄位
CREATE TABLE `plugindata` (
  `a` bigint(20) NOT NULL,
  `b` varchar(255) COLLATE utf8_bin NOT NULL,
  `c` varchar(255) COLLATE utf8_bin NOT NULL,
  `d` datetime DEFAULT NULL,
  `e` longblob,
  PRIMARY KEY (`a`),
  UNIQUE KEY `bb` (`b`),
  UNIQUE KEY `cc` (`c`)
) ENGINE=InnoDB

t庫下的這個表中只有一行記錄
mysql> select count(*) from t.plugindata;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.02 sec)
t1庫上的這個表中隊了包含上面那一行記錄,還有另外小一些的8行記錄
mysql> select count(*) from t1.plugindata;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.00 sec)
t庫下的大小是39M
和庫下的大小是61M

測試:
場景1:

set global max_allowed_packet=16777216

mysqldump預設的max_allowed_packet是24M
mysqldump -uroot -ptest -S /data/mysqld.sock  t plugindata > /tmp/a.sql
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `plugindata` at row: 0
mysqldump -uroot -ptest -S /data/mysqld.sock  t1 plugindata > /tmp/a.sql
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `plugindata` at row: 1
都匯出報錯


場景2:
加大mysqldump的 max_allowed_packet
set global max_allowed_packet=16777216

mysqldump的max_allowed_packet改為40M
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=41943040  t plugindata > /tmp/a.sql --可以正常匯出

匯出那個大一點的表
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=41943040  t1 plugindata > /tmp/a.sql --也可以正常匯出 

mysqldump的max_allowed_packet改為39M
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=40894464  t plugindata > /tmp/a.sql --可以正常匯出
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=40894464  t1 plugindata > /tmp/a.sql --也可以正常匯出 

mysqldump的max_allowed_packet改為38M
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=39845888  t plugindata > /tmp/a.sql
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `plugindata` at row: 0
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=39845888  t1 plugindata > /tmp/a.sql
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `plugindata` at row: 1
兩種都報錯


場景3:
加大mysql的 max_allowed_packet到40M
set global max_allowed_packet=41943040

mysqldump -uroot -ptest -S /data/mysqld.sock  t plugindata > /tmp/a.sql
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `plugindata` at row: 0

mysqldump -uroot -ptest -S /data/mysqld.sock   t1 plugindata > /tmp/a.sql
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `plugindata` at row: 1
都報錯

場景3:
加大mysql的 max_allowed_packet到60M   也試了加到600M都不行
set global max_allowed_packet=62914560



匯入測試:
一條記錄的匯出為par.sql ,9條記錄的匯出為full.sql
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=40894464  t plugindata > /tmp/part.sql
mysqldump -uroot -ptest -S /data/mysqld.sock --max-allowed-packet=40894464  t1 plugindata > /tmp/full.sql

測試:
場景1:
set global max_allowed_packet=16777216
mysql命令列預設的max_allowed_packet大小是16M

mysql -uroot -ptest -S /data/mysqld.sock  test1 < /tmp/part.sql
ERROR 2006 (HY000) at line 43: MySQL server has gone away
匯入報錯

場景2:
set global max_allowed_packet=41943040
mysql命令列預設的max_allowed_packet大小是16M

mysql -uroot -ptest -S /data/mysqld.sock  test1 < /tmp/part.sql
ERROR 2006 (HY000) at line 43: MySQL server has gone away
匯入報錯


場景3:
set global max_allowed_packet=16777216
mysql命令列改為40M

mysql -uroot -ptest -S /data/mysqld.sock  --max-allowed-packet=41943040 test1 < /tmp/part.sql
ERROR 2006 (HY000) at line 43: MySQL server has gone away
匯入報錯


場景4:
set global max_allowed_packet=16777216
mysql命令列改為400M

mysql -uroot -ptest -S /data/mysqld.sock  --max-allowed-packet=419430400 test1 < /tmp/part.sql
ERROR 2006 (HY000) at line 43: MySQL server has gone away
匯入報錯

場景5:
set global max_allowed_packet=41943040
mysql命令列改為40M

mysql -uroot -ptest -S /data/mysqld.sock  --max-allowed-packet=41943040 test1 < /tmp/part.sql
ERROR 2006 (HY000) at line 43: MySQL server has gone away
匯入報錯

場景6:
set global max_allowed_packet=47185920
mysql命令列改為45M

mysql -uroot -ptest -S /data/mysqld.sock  --max-allowed-packet=47185920 test1 < /tmp/part.sql
mysql -uroot -ptest -S /data/mysqld.sock  --max-allowed-packet=47185920 test1 < /tmp/full.sql
兩個都可以成功

查詢時:

mysql> set global max_allowed_packet=471859200;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
 mysql -uroot -ptest -S /data/mysqld.sock 
mysql> select * from t.plugindata;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    15868
Current database: *** NONE ***

ERROR 2020 (HY000): Got packet bigger than 'max_allowed_packet' bytes

加大引數: 即可成功
 mysql -uroot -ptest -S /data/mysqld.sock  --max-allowed-packet=41943040 

總結:
1 匯出:
  mysqldump的max_allowed_packet引數為最大行的所佔用的長度即可匯出成功,mysql伺服器引數無關
2 匯入:
  mysql伺服器引數和mysql命令列引數都略大於最大行的長度方可匯入成功  
 
3 如果想在mysql客戶端也能成功顯示記錄的,需要進入mysql命令列的引數上加上max-allowed-packet為最大行的大小


轉載請註明源出處 
QQ 273002188 歡迎一起學習 
QQ 群 236941212 
oracle,mysql,mongo 相互交流

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25099483/viewspace-1815789/,如需轉載,請註明出處,否則將追究法律責任。

相關文章