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

在linux服务器上自动备份MySQL数据库,mysql,linux,backup,Mysql,Linux,Backup,我需要一个脚本,自动备份一个MySql数据库。我知道已经有很多关于这个话题的帖子和脚本了,但这就是我的不同之处 脚本需要在托管MySql数据库的机器上运行(这是一台linux机器) 备份必须保存到数据库所在的服务器上 需要每30分钟进行一次备份 如果备份时间超过一周,则会将其删除,除非这是该周创建的第一个备份。i、 e在这些备份中,备份\u 1\u 12\u 2010\u 0-00\u Mon.db、备份\u 1\u 12\u 2010\u 0-30\u Mon.db、备份\u 1\u 12\u

我需要一个脚本,自动备份一个MySql数据库。我知道已经有很多关于这个话题的帖子和脚本了,但这就是我的不同之处

  • 脚本需要在托管MySql数据库的机器上运行(这是一台linux机器)
  • 备份必须保存到数据库所在的服务器上
  • 需要每30分钟进行一次备份
  • 如果备份时间超过一周,则会将其删除,除非这是该周创建的第一个备份。i、 e在这些备份中,备份\u 1\u 12\u 2010\u 0-00\u Mon.db、备份\u 1\u 12\u 2010\u 0-30\u Mon.db、备份\u 1\u 12\u 2010\u 1-00\u Mon.db。。。备份7_12_2010_23-30_Sun.db等仅保留备份1_12_2010_0-00_Mon.db

  • 有人有类似的想法或想法从哪里开始吗?

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

    mysqldump -u<user> -p<pass> <database> > /path/to/dumps/db.$(date +%a.%H:%M).dump
    
    mysqldump-u-p>/path/to/dumps/db.$(日期+%a.%H:%M)。转储
    
    这将每30分钟创建一次数据库转储,每周它将开始覆盖前一周的转储

    然后有另一个每周运行一次的cronjob,将最近的转储复制到保存快照的单独位置。

    回答: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
    

    然后用

     crontab -e
    
    设置为

     **0 1 * * *** /home/youruser/coolscripts/something.sh
    
    请记住,数字或“*”字符具有以下结构:


    就像很多人一样

  • 脚本需要在承载MySql数据库的机器上运行(它是linux机器)。
    =>在此计算机“a”上创建本地bash或perl脚本(或其他任何“myscript”

  • 备份必须保存到数据库所在的同一服务器上。
    =>在脚本“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
    
    }
    
    然后,要删除早于“日期”的文件,您可以查看man find,并关注mtime较新的选项


    编辑:如前所述,对本地备份没有特别的兴趣,除了temproray文件,它可以轻松发送tarball并在发送时将其删除。

    创建一个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天的备份。如果您不想这样做,只需从脚本中删除最后一行。

    我更喜欢Debian附带的那一行。这非常简单,可以创建每日备份,并且可以进行配置。此外,它每周存储一次,然后每月存储一次备份


    我已经运行了一段时间,它的配置和使用非常简单

    > P>你可以考虑这个开源工具MATRI,它是一个并发的MySQL备份脚本,它的元数据是在SqLITE3中。功能(比您要求的更多…):

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

    完整披露:matiri的原始作者。

    在简要阅读了问题和正确答案后,我将补充几点。其中一些已经提到

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

  • 创建备份
  • 压缩备份文件
  • 加密压缩备份
  • 将备份发送到云(DropBox、OneDrive、GoogleDrive、AmazonS3等)
  • 获取有关结果的通知
  • 设置计划以定期运行备份过程
  • 删除旧的备份文件
  • 要合成一个涵盖所有备份步骤的脚本,您需要付出努力并掌握相关知识

    我想与大家分享一篇文章(我是作者之一),其中介绍了备份MySQL数据库最常用的方法,并提供了一些详细信息:

  • Bash脚本

    # 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
    
  • 第三方工具


  • 希望这会有帮助

    切勿将备份放在生产机器中。如果您的生产服务器死机,您的备份也会消失。如果您的发行版支持,我会将脚本(或其符号链接)放到/etc/cron.daily文件夹中,而不是专门向主crontab添加一行。
    30 8 * * * /shell_dir/filename.sh
    
    # 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
    
    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