导入 50GB SQL 表的内存、交换和 mysql 配置要求?

导入 50GB SQL 表的内存、交换和 mysql 配置要求?

更新:

尽管按照以下两个答案所建议的方式进行了更改,但导入再次失败后,Mysql 现在无法启动。

tail /var/log/syslog
Jul 10 01:13:48 homestead kernel: [64517.537149] EXT4-fs warning (device dm-6): ext4_end_bio:323: I/O error 3 writing to inode 20 (offset 8388608 size 4194304 starting block 17079280)
Jul 10 01:13:49 homestead mysqld[25025]: Unable to determine if daemon is running: Success
Jul 10 01:13:49 homestead systemd[1]: mysql.service: Control process exited, code=exited status=1
Jul 10 01:13:49 homestead systemd[1]: mysql.service: Failed with result 'exit-code'.
Jul 10 01:13:49 homestead systemd[1]: Failed to start MySQL Community Server.
Jul 10 01:13:49 homestead systemd[1]: mysql.service: Service hold-off time over, scheduling restart.
Jul 10 01:13:49 homestead systemd[1]: mysql.service: Scheduled restart job, restart counter is at 1978.
Jul 10 01:13:49 homestead systemd[1]: Stopped MySQL Community Server.
Jul 10 01:13:49 homestead systemd[1]: Starting MySQL Community Server...
Jul 10 01:13:49 homestead env[1039]: [APIv1] KEEPALIVE /api/v1/events

原始帖子:

如何计算/确定内存、交换和良好的 mysql 配置的最佳设置?

几天来,我一直在尝试将 50GB 的 SQL 表导入虚拟机(特别是 Oracle VM VirtualBox)中本地计算机的数据库。这台虚拟机有 12GB 基本内存(我的 PC 最多有 16 台)和 2 个处理器(我的 PC 最多有 4 台)。

无论我尝试导入数据库,它都会返回 mysql 已消失的错误,然后我无法再连接到 mysql,因为 innodb 正在后台一次又一次地尝试恢复自身。

我可以说这个问题是一个与内存相关的问题,因为当我添加更多内存限额时,在它崩溃之前会导入更多记录。

  • 我尝试提供 30GB 的 SWAP 但它仍然崩溃了!
  • 我上次尝试时,table.ibd 文件(位于 /var/lib/mysql/mydatabase 中)的大小达到 58GB)

不确定下一步该尝试什么,除了放弃并使用 --skip-extended-inserts 标志重新导出表。

执行导入时我的当前 mysql 配置:

sudo nano /etc/mysql/conf.d/mysql.cnf

[mysqld]
innodb_doublewrite = 0
innodb_buffer_pool_size = 7G
innodb_log_buffer_size = 2G
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0
max_allowed_packet = 1073741824
key_buffer_size=2G
max_connections=1000
query_cache_type=1
query_cache_limit=256K
query_cache_min_res_unit=2k
query_cache_size=200M
sort_buffer_size=16M
read_buffer_size=16M
read_rnd_buffer_size=16M

失败后,我可以通过运行“top”命令看到 mysqld 进程存在,并且正在用以下命令反复尝试 innodb 恢复:

sudo strace -e trace=read,write -s 2000 -fp $(pgrep -nf mysql) 2>&1

仅供参考,我运行一个查询来转储表,如下所示:

mysqldump -h localhost --user=用户 --password=密码 mydatabase my50gbtable --hex-blob --single-transaction --quick --max_allowed_pa​​cket=999M --compress > my50gbtable.sql

我非常感激您的任何想法!

答案1

您不想使用--single-transaction来转储数据。导入时,MySQL 服务器必须在导入期间将表的全部内容保存在内存中,直到提交为止,这样就违背了 等选项的目的--quick

不使用就转储数据库--single-transaction

答案2

哪个引擎?应该是 InnoDB。在这种情况下,您不需要在 上浪费 2G key_buffer_size;将其设置为仅20M

innodb_log_buffer_size = 2G-- 这只是一个缓冲区;它不需要很大,将它设置得这么大只会浪费内存。返回默认值(或者说16M)。

您说“基本”内存为 12GB。“基本”是什么意思?如果您的虚拟机 (OS+mysql,没有其他) 确实有 12GB,那么您设置的 7G 就innodb_buffer_pool_size很好了。

max_connections=1000—— 又一个浪费空间的因素。加载将只使用一个连接,因此默认(可能是 151)就可以了。

query_cache_size=200M—— 又一个浪费空间的垃圾。它不会帮助加载根本,而且会浪费 RAM。大多数系统最好使用0。查询缓存在集群环境和 MySQL 8.0 中不可用。

不需要交换空间。(也就是说,它是可选的。)由于您崩溃了,所以有些事情并不像看上去的那样。

相关内容