Mysql

靜默導入 16 GB MySQL 文件失敗

  • July 28, 2021

我在這裡看了很多答案MySQL 有什麼方法可以更快地導入一個巨大的(32 GB)sql 轉儲?在伺服器故障上,但還沒有找到無法完全導入 16 GB MySQL 文件的解決方案;它在導入的不同部分靜默失敗。有時會在導入停止之前導入 2 GB,有時會導入 10 GB。日誌中沒有錯誤。有時控制台會返回 #,有時則不會。

top顯示導入時 MySQL 以 100% 執行,但在導入停止時下降到正常負載。

該數據庫為 16 GB,有 90% 的 InnoDB 表和一些 MyISAM 表。要在第一台機器上導出數據庫,我正在使用

mysqldump --single-transaction --lock-tables  -u mydatabaseuser -p mydatabase > archive.sql

導入機器有 8 個專用核心和 150 GB 專用 RAM(伺服器位於 Linode),執行 Alma Linux 和 MySQL 8.0.25。

要導入,我正在使用

mysql -u root -p mydatabase < archive.sql

從 mysql 中執行導入,即使用mysql>沒有幫助。

一張表是 12 GB,我嘗試自行導入該表,但沒有成功。

在 mysql 重啟時使用這些my.cnf會引發錯誤:

autocommit=0
unique_checks=0
foreign_key_checks=0

我應該以不同的方式導出嗎?

導入機器上的 MySQL 是否超時?

我需要編輯my.cnf什麼?

導入機器上的 my.cnf:

[mysqld]
disable-log-bin=1
default-authentication-plugin=mysql_native_password
performance-schema=0


port = 3306
socket = /tmp/mysql.sock
skip-external-locking
skip-name-resolve


# uncomment for import
bulk_insert_buffer_size = 40G
read_buffer_size = 40G


# If I uncomment these, MySQL throws the error on restart
# Job for mysqld.service failed because the control process exited with error code"
# autocommit=0
# unique_checks=0
# foreign_key_checks=0


innodb_buffer_pool_size=50G
innodb_buffer_pool_instances=56
innodb_log_file_size = 8G
innodb_log_buffer_size=64M
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_io_capacity=300

innodb_doublewrite = 0

max_allowed_packet=268435456
open_files_limit=40000
innodb_file_per_table=1

join_buffer_size=128M
sort_buffer_size=2M
read_rnd_buffer_size=2M
key_buffer_size = 20M

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

21 年 7 月 28 日編輯

 mysql> SHOW GLOBAL VARIABLES LIKE '%timeout%';

 connect_timeout                      10       
 delayed_insert_timeout               300      
 have_statement_timeout               YES      
 innodb_flush_log_at_timeout          1        
 innodb_lock_wait_timeout             50       
 innodb_rollback_on_timeout           OFF      
 interactive_timeout                  28800    
 lock_wait_timeout                    31536000 
 mysqlx_connect_timeout               30       
 mysqlx_idle_worker_thread_timeout    60       
 mysqlx_interactive_timeout           28800    
 mysqlx_port_open_timeout             0        
 mysqlx_read_timeout                  30       
 mysqlx_wait_timeout                  28800    
 mysqlx_write_timeout                 60       
 net_read_timeout                     30       
 net_write_timeout                    60       
 replica_net_timeout                  60       
 rpl_stop_replica_timeout             31536000 
 rpl_stop_slave_timeout               31536000 
 slave_net_timeout                    60       
 wait_timeout                         6000     

mysql>  SHOW SESSION VARIABLES LIKE '%timeout%';

 connect_timeout                    10       
 delayed_insert_timeout             300      
 have_statement_timeout             YES      
 innodb_flush_log_at_timeout        1        
 innodb_lock_wait_timeout           50       
 innodb_rollback_on_timeout         OFF      
 interactive_timeout                28800    
 lock_wait_timeout                  31536000 
 mysqlx_connect_timeout             30       
 mysqlx_idle_worker_thread_timeout  60       
 mysqlx_interactive_timeout         28800    
 mysqlx_port_open_timeout           0        
 mysqlx_read_timeout                30       
 mysqlx_wait_timeout                28800    
 mysqlx_write_timeout               60       
 net_read_timeout                   30       
 net_write_timeout                  60       
 replica_net_timeout                60       
 rpl_stop_replica_timeout           31536000 
 rpl_stop_slave_timeout             31536000 
 slave_net_timeout                  60       
 wait_timeout                       28800

這3個設置可能是錯誤的。當 時autocommit=0,在發出 a 之前不會儲存任何COMMIT內容。

查看轉儲文件;它可能會有很多設置,加上一些巨大的(多行)INSERTs。Big INSERTslike 最適合搭配autocommit=ON.

150GB 是一個奇數的 RAM 大小;你確定嗎?

這些聽起來很危險,即使有 150G 的 RAM:

bulk_insert_buffer_size = 40G
read_buffer_size = 40G

它們是“緩衝區”,不需要很大;1G可能綽綽有餘。將它們設置為每個 100M。

16 是建議的最大值:

innodb_buffer_pool_instances=56

超時??

計時。它執行多長時間?也許正好是 5 分鐘?查找 600(秒)的超時設置。

SHOW GLOBAL VARIABLES LIKE '%timeout%';
SHOW SESSION VARIABLES LIKE '%timeout%';

引用自:https://dba.stackexchange.com/questions/295874