ibdata1文件正在被删除

时间:2014-05-20 10:54:42

标签: mysql innodb

上周经过一些数据库调优之后,我停止了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

任何帮助非常感谢!

由于

2 个答案:

答案 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