上周经过一些数据库调优之后,我停止了mysql并且无法重启。
经过长时间的故障排除后,我发现ibdata1文件没有它应该的那么大,它已被删除并重新创建为新的。
我从备份中检索了旧的9.5gb文件,替换了它,并且mysql又开始了,欢乐时光。
我今天遇到了更多的服务器问题,查看了mysql文件夹,文件又消失了。
我还没有停止mysql所以一切都还在运行,我将不得不从备份中检索它并用手指交叉重启。
所以我的问题是,为什么它会消失?我猜我们已经在my.cnf文件中进行了意外更改,然后没有重新启动。不幸的是我没有该文件的备份,因为我不知道有任何更改。
(不整洁)My.cnf如下:
[mysqld]
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
innodb_thread_concurrency= 4
innodb_buffer_pool_size = 2G
thread_concurrency = 3
thread_cache_size = 32
table_cache = 1024
query_cache_size = 64M
query_cache_limit = 2M
join_buffer_size = 8M
tmp_table_size = 256M
key_buffer = 32M
innodb_autoextend_increment=512
max_allowed_packet = 16M
max_heap_table_size = 256M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
innodb_log_file_size = 100M
innodb_additional_mem_pool_size = 20M
innodb_flush_log_at_trx_commit=2
innodb_lock_wait_timeout=1800
innodb_log_buffer_size=500K
log-error=/var/log/mysqld.log
slow_query_log = /var/log/mysql-slow.log
long_query_time = 5
pid-file=/var/run/mysqld/mysqld.pid
sort_buffer_size = 2M
read_buffer_size = 2M
wait_timeout = 120
key_buffer = 384M
tmp_table_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 1M
max_connections=50
query_cache_type = 1
任何帮助非常感谢!
由于
答案 0 :(得分:1)
不要停止MySQL! mysqld在运行时保持打开状态,因此它仍然在文件系统上。 MySQL永远不会删除ibdata1,所以它必须是一些外部命令。
要恢复数据库,请停止对数据库的所有写入,等待主线程处于“等待服务器活动”或“休眠”状态:
mysql> pager grep Main
PAGER set to 'grep Main'
mysql> show engine innodb status\G
Main thread id 4994568192, state: sleeping
1 row in set (0.00 sec)
转储所有数据库(此步骤不是必需的,但为了额外的安全,请执行此操作);
mysqldump -A > mydb.sql
在/proc
文件系统中找到已删除的ibdata1并将其复制回MySQL datadir
# ls -la /proc/`pidof mysqld`/fd/ | grep -e ibdata
lrwx------ 1 root root 64 May 26 02:41 3 -> /var/lib/mysql/ibdata1 (deleted)
注3 - 它是ibdata1的文件描述符。
将ibdata1复制回来:
# cp /proc/`pidof mysqld`/fd/3 /var/lib/mysql/ibdata1
然后重启MySQL
答案 1 :(得分:1)
@Akuzminsky的答案就是你需要做些什么来恢复当前的ibdata1。并且他是正确的,MySQL不会删除ibdata1,无论你的my.cnf配置如何。
所以其他东西就是删除文件。怎么会发现?尝试运行Linux Audit Daemon。您无法找到上次删除文件的内容(除非您已经在运行审计守护程序),但如果它再次发生,您已做好准备。
有关详细信息,请参阅此StackExchange答案:https://askubuntu.com/questions/48844/how-to-find-the-pid-of-the-process-which-has-deleted-a-file