参考链接:
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;