【问题标题】:Automatically Backup MySQL database on linux server在 Linux 服务器上自动备份 MySQL 数据库
【发布时间】:2012-01-16 18:53:12
【问题描述】:

我需要一个自动备份 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。

任何人有类似的事情或任何想法从哪里开始?

【问题讨论】:

  • 永远不要将备份放在生产机器上。如果你的生产服务器死了,你的备份也没有了。

标签: mysql linux backup


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    答案:一个定时任务

    说明

    尝试使用以下内容创建文件 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
    

    【讨论】:

    • 如果您的发行版支持,我实际上会将脚本(或指向它的符号链接)放到 /etc/cron.daily 文件夹中,而不是专门在主 crontab 中添加一行。跨度>
    【解决方案3】:

    和很多人一样。

    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
    
    }
    

    然后要删除早于“日期”的文件,您可以查看 ma​​n find 并专注于 mtimenewer 选项。

    编辑:如前所述,除了临时文件能够轻松发送压缩包并在发送时将其删除之外,对进行本地备份没有特别的兴趣。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我更喜欢 Debian 自带的AutoMySQLBackup。这真的很容易,并且可以创建可以配置的每日备份。此外,它每周存储一次,然后每月备份一次。

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

        【讨论】:

          【解决方案6】:

          您可以考虑使用这个开源工具 matiri,https://github.com/AAFC-MBB/matiri,它是一个在 Sqlite3 中包含元数据的并发 mysql 备份脚本。功能(超出您的要求...):

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

          完全披露:原始 matiri 作者。

          【讨论】:

            【解决方案7】:

            在简要阅读问题和好的答案后,我会再补充几点。其中一些已经被提及。

            备份过程可能涉及后续步骤:

            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. 自动mysql备份

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

            希望对您有所帮助!

            【讨论】:

              猜你喜欢
              • 2013-01-17
              • 1970-01-01
              • 2014-10-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多