mysqldump是mysql和mariadb上最好的备份工具之一,免费开源。
mysqldump 首先查询每一个数据库和每一个表的结构与数据,而后把查出的全部内容导出到文本文件中。它建立的默认的文本文件被称为dump文件,里面包含重建数据库和数据必需的SQL语句。mysql
mysqldump --user=admin_backup \ --password=123 --lock-all-tables --all-databases > /root/all-dbs.sql
--user=admin_back
让mysqldump以admin_back用户与MYSQL服务器交互,应该尽可能不用root账号来备份,由于若是是爱脚本执行的时候须要指定用户名和密码,并且都是明文写在脚本中,这样容易暴露,所以建立一个专有账户只须要读表和锁表权限更安全。
--password=123
指明备份账号的密码,交互模式下可使用--password 后面在弹出须要输入密码的时候再输入密码。
--lock-all-tables
在作备份前,先让mysql锁住全部表,备份完成才解锁,这会有个问题,对于比较繁忙的数据库来讲,长时间锁表会有很大影响。应尽可能分表分库备份。
--all-databases
导出全部数据库。sql
mysqldump --user=admin_back --password --lock-tables \ --verbose --databases test > /root/test.sql
--verbose
显示备份详细过程
--databases
后面接数据库的名称,指定备份哪一个数据库,若是要备份多个数据库,后面写上多个数据库的名称,并用空格隔开。数据库
mysqldump --user=admin_back --password --lock-tables \ --verbose --databases test --tables user > /root/test-user.sql
--tables
后面接表名,指定要备份的表安全
若是要想自动化备份能够编写脚本列入crontab。如:bash
#!/bin/bash # backup mysql use mydqldump tool,and add to crontab my_user='admin_back' my_pwd='123' db1='test1' db2='test2' date_today=$(date +%Y-%m-%d-%H:%M:%S) backup_dir='/data/backup' dump_file=$db1-$db2-$date-today'.sql' /usr/bin/mysqldump --user=$my_user --password=$my_pwd --lock-tables --databases $db1 $db2 > $backup_dir$dump_file
加入crontab任务计划服务器
crontab -e -u root * 1 * * * /root/back_mysql.sh
mysql --user=admin_backup --password < /root/test.sql
使用二进制日志能够作到按时间节点来恢复数据。二进制日志会记录全部执行过的,修改数据的SQL语句。session
[mysqld] log-bin binlog-ignore-db=mysql 重启mysql服务器,查看状态 MariaDB [(none)]> show master status; +----------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +----------------------+----------+--------------+------------------+ | mysql-bin-200.000002 | 2447 | m_s | | +----------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 查看二进制日志保存位置 MariaDB [(none)]> show variables where variable_name like 'datadir'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.00 sec) # ls /var/lib/mysql/mysql-bin* /var/lib/mysql/mysql-bin-200.000001 /var/lib/mysql/mysql-bin-200.000002 /var/lib/mysql/mysql-bin-200.000003 /var/lib/mysql/mysql-bin-200.index
# mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 >/root/m_s.txt # ll /root/m_s.txt -rw-r--r--. 1 root root 920 Mar 17 13:55 /root/m_s.txt
# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003 # at 922 #180317 14:58:31 server id 200 end_log_pos 989 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1521269911/*!*/; BEGIN /*!*/; # at 989 #180317 14:58:31 server id 200 end_log_pos 1104 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1521269911/*!*/; insert into haha (id,name) values(3,"3aaa"),(4,"4bb") /*!*/; # at 1104 #180317 14:58:31 server id 200 end_log_pos 1131 Xid = 159 COMMIT/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
其中#开头表示注释
BEGIN和COMMIT中间表示事务
at 后面跟的是pos位置信息
at下面一行表示 执行时间,结束日志位置号工具
MariaDB [m_s]> select * from haha; +----+-----------+ | id | name | +----+-----------+ | 1 | wangshib | | 2 | guohuihui | | 3 | 3aaa | | 4 | 4bb | +----+-----------+ 4 rows in set (0.00 sec)
# mysqldump --database m_s --user=root --password --tables haha --flush-logs > /root/mysql/m_s-haha.sql Enter password: # ll /root/mysql/m_s-haha.sql -rw-r--r--. 1 root root 1917 Mar 17 15:29 /root/mysql/m_s-haha.sql
--flush-logs 表示备份时刷新二进制日志ui
咱们手动把 haha 表中的id为3和4的数据删除日志
MariaDB [m_s]> delete from haha where id in (3,4); Query OK, 1 row affected (0.00 sec) MariaDB [m_s]> select * from haha; +----+-----------+ | id | name | +----+-----------+ | 1 | wangshib | | 2 | guohuihui | +----+-----------+ 3 rows in set (0.00 sec)
先导出二进制日志
先查看一下二进制日志 MariaDB [m_s]> show master logs; +----------------------+-----------+ | Log_name | File_size | +----------------------+-----------+ | mysql-bin-200.000001 | 2664 | | mysql-bin-200.000002 | 2466 | | mysql-bin-200.000003 | 1178 | | mysql-bin-200.000004 | 428 | +----------------------+-----------+ 4 rows in set (0.00 sec) [root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003 |grep insert /*!40019 SET @@session.max_insert_delayed_threads=0*/; insert into haha (id,name) values('7','aaa') insert into m_s.haha values(1,"wangshib"),(2,"guohuihui") insert into haha (id,name) values(3,"3aaa"),(4,"4bb") [root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000004 |grep insert /*!40019 SET @@session.max_insert_delayed_threads=0*/; 咱们看到在mysql-bin-200.000003这个日志中记录了 插入语句(id,3,4),那就把这个二进制日志先导出成为文本文件再抽取出咱们须要恢复语句。 # mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 > /root/mysql/m_s-haha.txt [root@master ~]# vi /root/mysql/m_s-haha.txt ... # at 922 61 #180317 14:58:31 server id 200 end_log_pos 989 Query thread_id=2 exec_time=0 error_code=0 62 SET TIMESTAMP=1521269911/*!*/; 63 BEGIN 64 /*!*/; 65 # at 989 66 #180317 14:58:31 server id 200 end_log_pos 1104 Query thread_id=2 exec_time=0 error_code=0 67 SET TIMESTAMP=1521269911/*!*/; 68 insert into haha (id,name) values(3,"3aaa"),(4,"4bb") 69 /*!*/; 70 # at 1104 71 #180317 14:58:31 server id 200 end_log_pos 1131 Xid = 159 ...
这里执行insert id=3的语句开始pos位置为 989 结束于1104
# mysqlbinlog --database=m_s --start-position="989" --stop-position="1104" /var/lib/mysql/mysql-bin-200.000003 | mysql --user=root --password Enter password: MariaDB [m_s]> select * from haha; +----+-----------+ | id | name | +----+-----------+ | 1 | wangshib | | 2 | guohuihui | | 3 | 3aaa | | 4 | 4bb | +----+-----------+ 4 rows in set (0.00 sec)
这里看到数据已经恢复成功。