在linux服务器上自动备份MySQL数据库
我需要一个脚本,自动备份一个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
有人有类似的想法或想法从哪里开始吗?您可以通过设置为每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
请记住,数字或“*”字符具有以下结构:
就像很多人一样
=>在此计算机“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的原始作者。在简要阅读了问题和正确答案后,我将补充几点。其中一些已经提到 备份过程可能包括以下步骤:
# 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