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

时间:2011-12-09 13:31:38

标签: mysql linux backup

我需要一个自动备份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。
  5. 任何人都有类似或任何想法从哪里开始?

7 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:8)

与许多人一样做得非常相似。

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

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

  3. 一些提示和功能可以帮助您入门,因为我不会发布我的整个脚本,但它并没有完全发挥作用但不是很远:

    #!/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 较新的选项。< / p> 编辑:如前所述,除了temproray文件之外,没有特别兴趣进行本地备份,以便能够轻松发送tarball并在发送时将其删除。

答案 2 :(得分:7)

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

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

这将每30分钟创建一次数据库转储,并且每周都会覆盖前一周的转储。

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

答案 3 :(得分:7)

创建一个类似下面的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)。将其作为filename.sh

保存在目录(shell_dir)中

使用crontab -e安排它每天运行,如:

30 8 * * * /shell_dir/filename.sh

这将每天早上8:30运行并备份数据库。它还会删除超过10天的备份。如果您不想这样做,只需删除脚本中的最后一行。

答案 4 :(得分:2)

简短阅读问题和好的答案后,我还要再说几点。已经提到了其中一些。

备份过程可能涉及以下步骤:

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

要编写一个脚本来覆盖所有备份步骤,您需要付出很多努力和知识。

我想分享一个link to an article(我是作者之一),其中详细介绍了备份MySQL数据库的最常用方法

  1. 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
    
  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. 第三方工具

希望这会有所帮助!

答案 5 :(得分:1)

我的偏好是Debian附带的AutoMySQLBackup。它非常简单,可以创建可以配置的每日备份。同样,它也会每周备份一次,然后每月备份一次。

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

答案 6 :(得分:0)

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

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

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