2014-05-20 67 views
0

上一次數據庫調優之後,我停止了mysql並且無法重新啓動。ibdata1文件正在被刪除

經過長時間的故障排除後,我發現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 

任何幫助,不勝感激!

謝謝

回答

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

+0

我很遺憾,我可以給這個答案只有一個+1。它值得更多。 –

1

@ Akuzminsky的答案是,你需要做的就是你當前ibdata1中回什麼。而且,無論my.cnf配置如何,MySQL都不會刪除ibdata1。

所以別的東西就是刪除文件。怎麼能找出答案?嘗試運行Linux Audit Daemon。您將無法找出上次刪除文件的情況(除非您已經在運行Audit Daemon),但萬一它再次發生,您就可以做好準備了。

詳見本StackExchange答案:https://askubuntu.com/questions/48844/how-to-find-the-pid-of-the-process-which-has-deleted-a-file

相關問題