我需要一个自动备份MySql数据库的脚本。我知道这个主题已经有很多帖子和脚本了,但这里是我的不同之处。
任何人都有类似或任何想法从哪里开始?
答案 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)
与许多人一样做得非常相似。
脚本需要在托管MySql数据库的机器上运行(它是一台linux机器) =>在本机“A”上创建一个本地bash或perl脚本(或其他)“myscript”
必须将备份保存到数据库所在的同一服务器上 =>在脚本“myscript”中,您可以使用 mysqldump 。在本地备份中,您可以创建通过 scp 发送到远程计算机的 tarball 。最后,您可以将备份脚本放入 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 和较新的选项。< / 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)
简短阅读问题和好的答案后,我还要再说几点。已经提到了其中一些。
备份过程可能涉及以下步骤:
要编写一个脚本来覆盖所有备份步骤,您需要付出很多努力和知识。
我想分享一个link to an article(我是作者之一),其中详细介绍了备份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
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
第三方工具
希望这会有所帮助!
答案 5 :(得分:1)
我的偏好是Debian附带的AutoMySQLBackup。它非常简单,可以创建可以配置的每日备份。同样,它也会每周备份一次,然后每月备份一次。
我已经运行了一段时间,它的配置和使用非常简单!
答案 6 :(得分:0)
你可能会考虑这个开源工具,matiri,https://github.com/AAFC-MBB/matiri这是一个带有Sqlite3元数据的并发mysql备份脚本。功能(比你要求的更多......):
完全披露:原始的matiri作者。