1. 程式人生 > >MySQL InnoDB 備份與恢復七種方式

MySQL InnoDB 備份與恢復七種方式

有幾種方式:

1 mysqldump, 這種方式不僅適用於InnoDB,還適用於其它型別的儲存引擎,如MyISAM。備份的時候將資料庫備份成SQL(包含drop,create,insert等語句),恢復的時候直接匯入即可。屬於邏輯備份。

2 copy file, 我們知道InnoDB底層儲存的時候會將資料和元資訊存在下列檔案中:

ibdata*, *.ibd, *.frm, *.ib_logfile*,所以備份這些檔案即可備份InnoDB的資料,另外別忘了將MySQL的配置檔案my.cnf也一併備份起來。如果my.cnf中開啟了innodb_file_per_table那麼InnoDB在儲存的時候也會像MyISAM那樣每一個表都會有相應的檔案,你也可以只備份其中的某些檔案(也就是表)。注意copy這些files的時候,最好能確保InnoDB的所有事務都commit了。比如你可以將MySQL暫時關閉掉,如果不能忍受一些down time的話,先不要考慮這種方式。另外還可以先獲取Table的read lock, 比如Lock Tables Customers READ. 你可以用show innodb status看看還有沒有活動的事務沒有commit。屬於物理備份。

下面講一下這種備份方式怎麼恢復:

a. 停止任何關於這個表的寫,lock tables customers write;

b. 刪除這個表的空間,alter table customers discard tablespace;

c. 將你備份的.ibd檔案拷貝到相應的目錄下。

d. 重新建立表空間,alter table customers import tablespace;

e. 釋放寫鎖,unlock tables customers;

3 ibbackup, 這是一個商業化的工具,將你線上的my.cnf配置檔案複製一份出來到比如說/etc/my.backup.cnf,更改裡邊的datadir等比如說到/data/backup,然後執行 ibbackup /etc/my.cnf /etc/my.backup.cnf, ibbackup就會講my.cnf所指向的的資料內容備份到my.backup.cnf指向的資料目錄。恢復的時候也很奇葩,因為你現在等於說是擁有了兩個資料目錄,所以你重新執行mysql,safe_mysqld --defaults-file=/etc/my.backup.cnf. 這種方式僅侷限於你的資料庫全部使用InnoDB儲存引擎。

4 innobackup,如果你還有其它資料表用的是MyISAM,那麼你可以使用innobackup,它不但會將InnoDB的相關檔案備份起來,還會將MyISAM的比如MYI, MYD檔案也備份起來。innobackup使用了ibbackup作為InnoDB的備份子工具。

5 利用MySQL Administrator

6 利用binary logs, 需要開啟log-bin, 所有的更新操作都會被寫到binary file裡。恢復的時候mysqlbinlog binlog_file | mysql,這種方式基本上可以用在線上備份上。屬於邏輯備份。

7 XtraBackup,對InnoDB做資料備份的開源工具,支援線上熱備,備份時不影響資料讀寫。屬於物理備份。專案地址https://github.com/percona/percona-xtrabackup,可以結合使用Innobackupex進行全備,xtrabackup進行增量備份。

個人覺得第一種,第二種和第六種和第七種都非常不錯,各有自己的特點。第一種方式比較適合小型的資料庫,由於是SQL,所以不僅可以跨儲存引擎,還能跨不同的資料庫,比如PostgreSQL。資料量稍大一些就可以用第二種方式了,由於是檔案傳輸,所以效率就是檔案傳輸的效率了。第六種方式將資料庫本身與備份方式利用binlog進行解耦,既不會對線上資料庫造成太大的overhead,而且因為所有的更新操作都在binlog裡了,所以可以利用此資料做很多的事情。第七種方式比較特殊,結合了第三種和第四種,所以功能上比較強大,商業上可以選用。

作者:hongchangfirst