在Linux服务器上自动备份MySQL数据库

14

我需要一个脚本,能够自动备份 MySql 数据库。我知道这个主题已经有很多帖子和脚本了,但是我的要求略有不同。

  1. 该脚本需运行在托管 MySql 数据库的机器上(它是一台 Linux 机器)。
  2. 备份必须保存在与数据库所在服务器相同的位置。
  3. 每隔 30 分钟需要进行一次备份。
  4. 当备份超过一周时,会删除除了那周第一个创建的备份之外的所有备份。例如,在以下备份中 backup_1_12_2010_0-00_Mon.db、backup_1_12_2010_0-30_Mon.db、backup_1_12_2010_1-00_Mon.db……backup_7_12_2010_23-30_Sun.db 中,只保留 backup_1_12_2010_0-00_Mon.db。

是否有任何类似的东西或任何开始的想法?


18
永远不要将备份放在生产机器上。如果您的生产服务器出现故障,您的备份也会消失。 - ajreal
7个回答

25

答案: cron

描述:

尝试创建一个名为something.sh的文件,并加入以下内容:

 #!/bin/sh
 mysqldump -u root -p pwd --opt db1.sql > /respaldosql/db1.sql
 mysqldump -u root -p pwd --opt db2.sql > /respaldosql/db2.sql
 cd /home/youuser/backupsql/
 tar -zcvf backupsql_$(date +%d%m%y).tgz *.sql
 find -name '*.tgz' -type f -mtime +2 -exec rm -f {} \;

给该文件赋予适当的权限

 chmod 700 mysqlrespaldo.sh
或者
 sudo chmod 700 something.sh

然后使用 cron 创建:

 crontab -e

设置它像这样

 **0 1 * * *** /home/youruser/coolscripts/something.sh
记住,数字或' * '字符具有以下结构:
Minutes (range 0-59)
Hours (0-23)
Day of month (1-31)
Month (1-12)
Day of the week (0-6 being 0=Domingo)
Absolute path to script or program to run
您还可以使用新版Linux发行版中提供的helper文件夹,其中包含/etc/cron.daily/etc/cron.hourly/etc/cron.weekly等。在这种情况下,您可以将脚本创建为符号链接到所选文件夹中,操作系统将负责按照承诺的重复运行它(摘自@Nick的强有力评论)。

5
如果你的发行版支持,我建议将脚本(或其符号链接)放置在 /etc/cron.daily 文件夹之一中,而不是将一行内容添加到主 crontab 中。这样做可以达到相同的效果。 - Nick

10
创建一个类似下面的shell脚本:
#!/bin/bash
mysqldump -u username -p'password' dbname > /my_dir/db_$(date+%m-%d-%Y_%H-%M-%S).sql
find /mydir -mtime +10 -type f -delete

替换用户名、密码和备份目录(my_dir)。将其保存到一个目录(shell_dir)中并命名为filename.sh。

使用crontab -e命令将其定期执行,例如每天执行:

30 8 * * * /shell_dir/filename.sh

每天早上8:30自动备份数据库,并删除10天前的备份。如果不需要自动删除,只需从脚本中删除最后一行即可。

9

和很多人一样做的差不多。

  1. 脚本需要在托管 MySql 数据库的机器上运行(它是一台 Linux 机器)。
    => 在此机器"A"上创建一个本地 bash 或 perl 脚本(或其他)"myscript"

  2. 备份必须保存在托管数据库的同一服务器上。
    => 在脚本"myscript"中,您可以直接使用mysqldump。从本地备份,您可以创建一个tarball,通过scp发送到远程机器。最后,您可以将备份脚本放入crontab(crontab -e)中。

以下是一些提示和函数,可帮助您入门,我不会发布我的整个脚本,因为它并没有完全解决问题,但离目标不远:

#!/bin/sh
...
MYSQLDUMP="$(which mysqldump)"   
FILE="$LOCAL_TARBALLS/$TARBALL/mysqldump_$db-$SNAPSHOT_DATE.sql"  
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db > $FILE && $GZIP $GZ_COMPRESSION_LEVEL $FILE   

function create_tarball()
{
local tarball_dir=$1
tar -zpcvf $tarball_dir"_"$SNAPSHOT_DATE".tar.gz" $tarball_dir >/dev/null
return $?
}

function send_tarball()
{
local PROTOCOLE_="2"
local IPV_="4"
local PRESERVE_="p"
local COMPRESSED_="C"
local PORT="-P $DESTINATION_PORT"
local EXECMODE="B"

local SRC=$1
local DESTINATION_DIR=$2
local DESTINATION_HOST=$DESTINATION_USER"@"$DESTINATION_MACHINE":"$DESTINATION_DIR

local COMMAND="scp -$PROTOCOLE_$IPV_$PRESERVE_$COMPRESSED_$EXECMODE $PORT $SRC $DESTINATION_HOST &"

echo "remote copy command: "$COMMAND
[[ $REMOTE_COPY_ACTIVATED = "Yes" ]] && eval $COMMAND

}

如果您想删除比"date"更早的文件,可以查看man find并关注 mtime newer 选项。

编辑:如前所述,没有特别的兴趣进行本地备份,除了一个临时文件以便于发送tarball并在发送后删除。


8

您可以通过设置每30分钟运行的一行cronjob来完成大部分操作:

mysqldump -u<user> -p<pass> <database> > /path/to/dumps/db.$(date +%a.%H:%M).dump

这将每30分钟创建一个数据库备份,并且每周都会开始覆盖上一周的备份。

然后再有另一个cronjob,每周运行一次,将最新的备份复制到一个单独的位置,你可以在那里保存快照。


3

阅读问题和好的答案后,我想补充几点。其中有些已经提到了。

备份过程可能包括以下步骤:

  1. 创建备份
  2. 压缩备份文件
  3. 加密压缩备份
  4. 将备份发送到云端(DropBox、OneDrive、GoogleDrive、AmazonS3 等)
  5. 获取关于结果的通知
  6. 设置定期运行备份过程的计划
  7. 删除旧的备份文件

要编写一个脚本来覆盖所有备份步骤,需要投入一定的精力和知识。

我想分享一篇文章链接(我是其中的一位作者),其中详细描述了备份 MySQL 数据库的最常用方法

  1. Bash script

    # Backup storage directory  
    backup_folder=/var/backups
    
    # Notification email address 
    recipient_email=<username@mail.com>
    
    # MySQL user
    user=<user_name>
    
    # MySQL password
    password=<password>
    
    # Number of days to store the backup 
    keep_day=30 
    
    sqlfile=$backup_folder/all-database-$(date +%d-%m-%Y_%H-%M-%S).sql
    zipfile=$backup_folder/all-database-$(date +%d-%m-%Y_%H-%M-%S).zip 
    
    # Create a backup 
    sudo mysqldump -u $user -p$password --all-databases > $sqlfile 
    
    if [ $? == 0 ]; then
       echo 'Sql dump created' 
    else
       echo 'mysqldump return non-zero code' | mailx -s 'No backup was created!' $recipient_email  
       exit 
    fi 
    
    # Compress backup 
    zip $zipfile $sqlfile 
    
    if [ $? == 0 ]; then
       echo 'The backup was successfully compressed' 
    else
       echo 'Error compressing backup' | mailx -s 'Backup was not created!' $recipient_email 
       exit 
    fi 
    
    rm $sqlfile 
    
    echo $zipfile | mailx -s 'Backup was successfully created' $recipient_email 
    
    # Delete old backups 
    find $backupfolder -mtime +$keep_day -delete
    
  2. Automysqlbackup

    sudo apt-get install automysqlbackup
    wget https://github.com/sixhop/AutoMySQLBackup/archive/master.zip
    
    mkdir /opt/automysqlbackup
    mv AutoMySQLBackup-master.zip 
    cd /opt/automysqlbackup
    tar -zxvf AutoMySQLBackup-master.zip
    
    ./install.sh
    
    sudo nano /etc/automysqlbackup/automysqlbackup.conf
    
    CONFIG_configfile="/etc/automysqlbackup/automysqlbackup.conf"
    CONFIG_backup_dir='/var/backup/db'
    CONFIG_mysql_dump_username='root'
    CONFIG_mysql_dump_password='my_password'
    CONFIG_mysql_dump_host='localhost'
    CONFIG_db_names=('my_db')
    CONFIG_db_exclude=('information_schema')
    CONFIG_mail_address='mail@google.com'
    CONFIG_rotation_daily=6
    CONFIG_rotation_weekly=35
    CONFIG_rotation_monthly=150
    
    automysqlbackup /etc/automysqlbackup/automysqlbackup.conf
    
  3. Third party tools

希望这对你有帮助!


2

我的首选是AutoMySQLBackup,它自带Debian。它非常容易使用并可以配置每日备份。此外,它还会存储每周一次和一个月一次的备份。

我已经使用这个工具运行了一段时间了,它非常容易配置和使用!


0

您可以考虑使用这个开源工具matiri,https://github.com/AAFC-MBB/matiri它是一个带有Sqlite3元数据的并发mysql备份脚本。以下是一些功能(比您要求的更多):

  • 多服务器:支持多个MySQL服务器,无论它们是否位于同一物理服务器上。
  • 并行:对要备份的服务器上的每个数据库单独进行,并行处理(并发设置:默认值:3)
  • 压缩:每个数据库备份都经过压缩
  • 校验和:存储每个压缩备份文件的SHA256以及所有文件的归档
  • 归档:所有数据库备份都打包成单个文件
  • 记录:备份信息存储在Sqlite3数据库中

完全披露:原始matiri作者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接