參考鏈接:
https://www.cnblogs.com/f-ck-need-u/archive/2018/05/09/9013458.html#auto_id_0
備份多個庫。
mysqldump -uroot -p123456 -S /tmp/mysql.sock --databases backuptest backuptest1 >/tmp/mutil_db.bak
備份所有庫。
mysqldump -uroot -p123456 -S /tmp/mysql.sock --all-databases >/tmp/all_db.bak
備份時亂碼:
使用字符集選項示例
dump數據的時候,客戶端和數據庫的字符集不一致的話會進行字符集轉換,轉換的過程是不可逆的,所以有可能會導致亂碼。
例如,插入一個帶有中文字符的記錄到字符集為latin1的表student中。
insert INTO backuptest.`student` VALUES (6,'馬','male','2017-03-31');
如果提示無法插入,則設置客戶端字符集和連接字符集為latin1,character_set_client、character_set_connection、character_set_results,使用set names latin1即可,它會設置它們3個。
插入成功之后,其他會話連接數據庫查詢將會是亂碼的。dump的時候也是亂碼的,因為dump默認會使用utf8字符集,在latin1轉碼為utf8的過程中出現了亂碼。
shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --databases backuptest >/tmp/backuptest.bak
shell> grep -i 'insert' /tmp/backuptest.bak
INSERT INTO `student` VALUES (1,'malongshuai','male','2017-03-31'),(2,'gaoxiaofang','female','2015-03-31'),(3,'longshuai','male','2012-03-31'),(4,'meishaonv','female','2014-03-31'),(5,'tun\'er','female','2013-03-31'),(6,'马','male','2017-03-31');
INSERT INTO `teacher` VALUES (1,'wugui','male','計算機網絡'),(2,'woniu','female','C語言'),(3,'xiaowowo','female','oracle');
再使用亂碼的文件來恢復的話,肯定是亂碼的結果。
這時可以指定dump時的字符集為latin1來使得dump數據時無需轉換字符集。
sudo mysqldump --all-databases --user=root --password --master-data > backupdb.sql
mysqldump: Error: Binlogging on server not active
解決方案:
sudo vi /etc/my.cnf
在[mysqld]標簽下添加:
log-bin=mysql-bin
server-id=1
shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --default-character-set=latin1 --databases backuptest >/tmp/backuptest.bak
shell> grep -i 'insert' /tmp/backuptest.bak
INSERT INTO `student` VALUES (1,'malongshuai','male','2017-03-31'),(2,'gaoxiaofang','female','2015-03-31'),(3,'longshuai','male','2012-03-31'),(4,'meishaonv','female','2014-03-31'),(5,'tun\'er','female','2013-03-31'),(6,'馬','male','2017-03-31');
測試完成之后,將新插入的含有中文字符的記錄刪除。
delete from backuptest.student where studentid=6;
mysqldump + 二進制日志備份
mysqldump可以實現全備份,在mysqldump之后再二進制日志備份就相當於增量備份,這樣就可以實現全備份之后的定時點還原。
假設要備份的是一張innodb表。使用下面的語句:
mysqldump -uroot -p123456 -S /mydata/data/mysql.sock -q --no-autocommit --flush-logs --single-transaction --master-data=2 --tables backuptest student >/tmp/innodb.sql;
因為dump前會flush二進制日志,所以之后對該表的操作會記錄到新的滾動日志中。然后只需備份新的二進制日志即可。
然后在該表中插入一行記錄。
insert into student select 10,'xiaolonglong','male','2015-01-02';
備份新的二進制日志。
mysqlbinlog mysql-bin.000002 >/tmp/new_binlog.sql
設計剛才備份的表誤操作,如刪除該表。
drop table student;
使用該表的完全備份和二進制日志恢復。因為備份時使用的是--tables選項,所以要恢復需要進入數據庫指定數據庫,然后使用source來加載sql文件。
use backuptest;
source /tmp/innodb.sql;
source /tmp/new_binlog.sql;