操作系统:CentOS 5.10
服务:Amazon Web Services
尝试删除 MySQL 5.0 并安装 MySQL 5.6
我设置了一台服务器,打算使用 MySQL,但它是使用 MySQL 5.0 设置的。由于有性能改进和添加了其他功能,而且还没有任何数据或任何东西,所以我想安装 MySQL 5.6。
我按照 Oracle 发布的指南安装了 RPM 以在 RHEL 5 上使用:
http://dev.mysql.com/doc/mysql-repo-excerpt/5.6/en/linux-installation-yum-repo.html
一切都很顺利,我可以在安装后立即启动服务 - 但是......
当我到达这一步时:
始终运行程序 mysql_secure_installation 以保护您的 MySQL 安装:
shell> mysql_secure_installation
mysql_secure_installation 允许您执行重要的操作,例如设置 root 密码、删除匿名用户等。该程序安全且易于使用。不过,记住您设置的 root 密码很重要。有关详细信息,请参阅 mysql_secure_installation — 提高 MySQL 安装安全性。
我运行了 mysql_secure_installation,当它要求输入密码时,我尝试按 Enter 键,因为我还没有为 root@localhost 设置密码。
我被告知密码不正确。
因此,尝试了以前的密码,但出现了一个错误,该错误已经丢失,因为我是通过腻子连接的,并且当我失去连接时窗口关闭了。
无论如何 - 我只是再次要求输入密码,所以我尝试按 Enter 键,然后再次使用旧密码,但仍然不起作用。
所以我取消了该过程,sudo /sbin/service mysqld stop
然后运行sudo /sbin/service mysqld start
。外壳停下来,挂了一秒钟,然后窗口关闭,我的连接也随之关闭。
我尝试再次打开 ssh 连接,但超时。等待几分钟后,我可以 ssh 回到服务器。
每次我尝试启动 mysqld 服务时,我的 ssh 会话都会关闭。这是否意味着 sshd 也崩溃了?
日志文件/var/log/mysql.log
仅包含以下内容:
131204 23:49:02 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
131204 23:50:53 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
131205 00:05:12 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
131205 00:06:28 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
131205 00:08:09 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
131205 00:09:14 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
131205 00:13:54 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
131205 00:15:04 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
131205 00:25:12 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
131205 00:26:45 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
我尝试过手动运行mysql,也发生了同样的事情。
从这里我该怎么办?
编辑:
我刚刚运行 mysqld_safe 来查看输出是什么,到目前为止:
[user@machine mysql]$ sudo /usr/bin/mysqld_safe
131205 01:13:33 mysqld_safe Logging to '/var/log/mysqld.log'.
131205 01:13:33 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Killed
在挂断我电话之前。
如果我移动 InnoDB 使用的那些数据库会发生什么?
根据帕特里克的说法,我检查dmesg
并搜索了mysqld
。
我发现了以下内容:
type=1400 audit(1386200078.706:1929): avc: denied { read } for pid=20563 comm="nohup" path="/usr/sbin/mysqld" dev=xvda1 ino=375035 scontext=user_u:system_r:netutils_t:s0 tcontext=system_u:object_r:mysqld_exec_t:s0 tclass=file
sudo invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0
Call Trace:
[<ffffffff802c1b64>] out_of_memory+0x8b/0x203
[<ffffffff8020fa5d>] __alloc_pages+0x27f/0x308
[<ffffffff802139dd>] __do_page_cache_readahead+0xc8/0x1af
[<ffffffff8021424e>] filemap_nopage+0x14c/0x360
[<ffffffff80208e9d>] __handle_mm_fault+0x444/0x144f
[<ffffffff8026ea01>] monotonic_clock+0x35/0x7b
[<ffffffff8029b54a>] attach_pid+0x7c/0xa9
[<ffffffff80266d94>] do_page_fault+0xf72/0x131b
[<ffffffff8024901b>] skb_dequeue+0x48/0x50
[<ffffffff80254146>] unix_release_sock+0x19e/0x1fa
[<ffffffff80261df5>] thread_return+0x6c/0x113
[<ffffffff80207116>] kmem_cache_free+0x84/0xd7
[<ffffffff80207116>] kmem_cache_free+0x84/0xd7
[<ffffffff8025f82b>] error_exit+0x0/0x6e
和:
mysqld invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0
Call Trace:
[<ffffffff802c1b64>] out_of_memory+0x8b/0x203
[<ffffffff8020fa5d>] __alloc_pages+0x27f/0x308
[<ffffffff802139dd>] __do_page_cache_readahead+0xc8/0x1af
[<ffffffff8021424e>] filemap_nopage+0x14c/0x360
[<ffffffff80208e9d>] __handle_mm_fault+0x444/0x144f
[<ffffffff8020622a>] hypercall_page+0x22a/0x1000
[<ffffffff8020622a>] hypercall_page+0x22a/0x1000
[<ffffffff80266d94>] do_page_fault+0xf72/0x131b
[<ffffffff80236fd3>] __vm_enough_memory+0xee/0xfc
[<ffffffff8020e472>] do_mmap_pgoff+0x35e/0x74a
[<ffffffff80236fd3>] __vm_enough_memory+0xee/0xfc
[<ffffffff80263929>] _spin_lock_irqsave+0x9/0x14
[<ffffffff802313f1>] __up_write+0x27/0xf2
[<ffffffff8025f82b>] error_exit+0x0/0x6e
Mem-info:
DMA per-cpu:
cpu 0 hot: high 0, batch 1 used:0
cpu 0 cold: high 0, batch 1 used:0
DMA32 per-cpu:
cpu 0 hot: high 186, batch 31 used:79
cpu 0 cold: high 62, batch 15 used:58
Normal per-cpu: empty
HighMem per-cpu: empty
Free pages: 4780kB (0kB HighMem)
Active:114881 inactive:1 dirty:1 writeback:0 unstable:0 free:1195 slab:5226 mapped-file:541 mapped-anon:114329 pagetables:1094
DMA free:2004kB min:48kB low:60kB high:72kB active:540kB inactive:0kB present:9076kB pages_scanned:1381592 all_unreclaimable? yes
lowmem_reserve[]: 0 489 489 489
DMA32 free:2776kB min:2804kB low:3504kB high:4204kB active:458984kB inactive:4kB present:500960kB pages_scanned:10643850 all_unreclaimable? yes
lowmem_reserve[]: 0 0 0 0
Normal free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
HighMem free:0kB min:128kB low:128kB high:128kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
DMA: 1*4kB 0*8kB 1*16kB 0*32kB 1*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 2004kB
DMA32: 28*4kB 1*8kB 0*16kB 1*32kB 1*64kB 0*128kB 0*256kB 1*512kB 0*1024kB 1*2048kB 0*4096kB = 2776kB
Normal: empty
HighMem: empty
585 pagecache pages
Swap cache: add 0, delete 0, find 0/0, race 0+0
Free swap = 0kB
Total swap = 0kB
Free swap: 0kB
131072 pages of RAM
5993 reserved pages
4445 pages shared
0 pages swap cached
Out of memory: Killed process 20563, UID 0, (mysqld).
从这里我该怎么办?
答案1
从dmesg
您提供的输出来看,确实是 OOM 杀手导致了您的问题。
基本上发生的情况是,启动 mysql 后,系统耗尽了所有可用内存。当这种情况发生时,内核必须杀死一些东西才能恢复一些东西。它有一个复杂的算法,用于尝试找到要杀死的东西,而不会导致系统不稳定。该算法恰好选择了您的 shell。然后,在您的 shell 被杀死后,它发现这还不够,并开始杀死其他东西。最终它到达mysql进程并杀死它。
输出dmesg
还显示系统上只有大约 500mb 的内存。我通常认为这足以运行 mysql(如果它很小,并且您不关心性能)。但显然这表明情况并非如此。
盒子上是否有其他程序正在使用大量内存?输出dmesg
还应该包括进程列表以及它们消耗的内存量。
如果没有其他原因使用异常的内存量,有 2 个选项:
- 启用交换
- 添加更多内存(使用更大的实例大小)。
答案2
听起来现有 mysql 安装中的旧数据库文件仍然存在。如果有数据需要保留,请运行 mysql_upgrade 命令。如果不需要现有数据,请清除 /var/lib/mysql 并重新运行 mysql_secure_installation 脚本。