靜默導入 16 GB MySQL 文件失敗
我在這裡看了很多答案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
。BigINSERTs
like 最適合搭配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%';