mysql恢复删除的数据库和自动备份数据

公司有个哥们不小心删除了数据库,之前也没有备份,幸好mysql已经开启了binlog

1、less /etc/mysql.cnf

log-bin=mysql-bin  如果前面加了#,表示注释了,也就是没开启binlog

binlog_format=mixed

datadir = /usr/local/mysql/var       binlog日志文件所在目录,重启一次mysql都会产生一个新的binlog文件

2、通过mysqlbinlog从指定位置提取sql

mysqlbinlog --stop-position="1420697" /usr/local/mysql/var/mysql-bin.000083 > /home/Backup_1.sql

mysqlbinlog --start-position="4382351" /usr/local/mysql/var/mysql-bin.000082 > /home/Backup_2.sql

--stop表示把指定位置前面的都导出sql,--start把指定位置之后的都导出,当然是针对当前的binlog文件,不是针对所有binlog文件

如果报mysqlbinlog命令找不到,可以先找到mysql的bin目录,ps -ef|grep mysql,通过这个命令可以找到下面红色的路劲,即为mysql bin目录,然后在bin目录下执行上的命令,注意前面加./

root     10026     1  0 16:36 pts/3    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --pid-file=/usr/local/mysql/var/localhost.localdomain.pid
mysql    10409 10026  0 16:36 pts/3    00:00:15 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/usr/local/mysql/var/localhost.localdomain.pid --socket=/tmp/mysql.sock --port=3306

3、直接在服务器上执行导入sql,注意先后顺序,-f参数标识忽略错误继续执行

mysql -u root -p -f < Backup_2.sql

mysql -u root -p -f < Backup_2.sql

4、这样做可能会影响到其他库,因为binlog里面记录了所以库的执行日志,所以最好在之心sql之前备份一下其他库,然后关闭binlog,执行sql,再执行其他库的备份sql,最后再开启binlog,关闭和开启binlog都需要重启数据库service mysql restart

5、通过crontab每天自动备份数据库,下面是脚本

  1. #!/bin/sh   
  2. # mysql_backup.sh: backup mysql databases and keep newest 5 days backup.   
  3.   
  4. # db_user is mysql username   
  5. # db_passwd is mysql password   
  6. # db_host is mysql host   
  7. # -----------------------------   
  8. db_user="root"   
  9. db_passwd="zhoz.com"  
  10. db_host="localhost"  
  11.  
  12. # the directory for story your backup file.   
  13. backup_dir="/home/zhozdbbackup"  
  14.  
  15. # date format for backup file (dd-mm-yyyy)   
  16. time="$(date +"%d-%m-%Y")"  
  17.  
  18. # mysql, mysqldump and some other bin's path  
  19. MYSQL="/usr/bin/mysql"   
  20. MYSQLDUMP="/usr/bin/mysqldump"   
  21. MKDIR="/bin/mkdir"  
  22. RM="/bin/rm"  
  23. MV="/bin/mv"  
  24. GZIP="/bin/gzip"  
  25.  
  26. # check the directory for store backup is writeable   
  27. test ! -w $backup_dir && echo "Error: $backup_dir is un-writeable." && exit 0  
  28.  
  29. # the directory for story the newest backup   
  30. test ! -d "$backup_dir/backup.0/" && $MKDIR "$backup_dir/backup.0/"  
  31.  
  32. # get all databases   
  33. all_db="$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse 'show databases')"   
  34. for db in $all_db   
  35. do   
  36. $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db | $GZIP -9 > "$backup_dir/backup.0/$time.$db.gz"   
  37. done  
  38.  
  39. # delete the oldest backup  
  40. test -d "$backup_dir/backup.5/" && $RM -rf "$backup_dir/backup.5"  
  41.  
  42. # rotate backup directory  
  43. for int in 4 3 2 1 0   
  44. do   
  45. if(test -d "$backup_dir"/backup."$int")   
  46. then   
  47. next_int=`expr $int + 1`   
  48. $MV "$backup_dir"/backup."$int" "$backup_dir"/backup."$next_int"   
  49. fi   
  50. done   
  51. exit 0;  
6、vi /etc/crontab  在最后一行添加0 0 * * * root /bak/bakmysql/backup.sh 。重启crontab:/sbin/service crond restart 。如果没有设置crontab为开机自启动可以如下设置其开机自启动:chkconfig --add crond

猜你喜欢

转载自blog.csdn.net/seelye/article/details/73806088