我是一名开发人员,我正在与系统管理员讨论如何备份我们正在使用的 MySQL 数据库。
之前的系统管理员告诉我他已经开始备份数据库,但是经验不足的新人却提出帮助我开发一个脚本。
首先,开发人员需要负责数据库备份,这正常吗?我工作过的其他每个地方,系统管理员都会处理这个问题,让我专心做开发。
因此,目前我有一个 Perl 脚本,它调用 mysql-dump,并将其与代码一起备份。现在由于某种原因,半夜的备份失败,并创建了一个截断版本的数据库。我开发了这个作为临时解决方案,几周前当我需要它时,备份失败了。出于这个原因,我希望系统管理员承担责任,因为我有代码要开发,不需要每天检查 cron 作业输出。
那么,每小时备份数据库的可靠方法是什么,如果备份失败则收到警告。
答案1
我所见过的典型情况是,企业主或其代表决定保留、可接受的数据丢失和恢复点目标,因为企业主是支付由此产生的账单的人。
DBA(和/或系统管理员)了解应用程序的配置文件(复杂事务或简单表更新、备份窗口、数据库大小、数据增长、更改的行数等)并决定适当的备份策略来满足这些要求。
此时,企业主通常会认为最初的白金备份要求太昂贵,因此只能重复这一过程。
开发人员甚至无法访问生产系统,即使可以,他们也不负责每日备份。(尽管在对数据库结构进行任何工作之前确保有备份是一种很好的做法)。
所以我同意你的观点,让它成为别人的问题。
如果您的应用程序通常运行更新多个表的事务,则您需要使用表锁定选项运行 mysqldump 以确保一致性。但这会在备份作业期间阻止对数据库的所有更新,因此每小时执行一次通常不是一个好主意。
二进制日志允许时间点恢复和增量备份。
看一眼http://dev.mysql.com/doc/refman/5.7/en/backup-methods.html
一个简单的脚本,用于备份 MySQL 服务器上的所有数据库,每个数据库都备份到单独的文件中。只有在出现问题时才会向您发送电子邮件。只要 cron 运行,就会创建备份。与往常一样,还要测试您的恢复能力!:
#!/bin/bash
# Simple script to create logical backups of all MySQL databases on
# a server. by http://serverfault.com/users/37681/hbruijn
# Free to use and modify as neeeded.
#======================================================================
# Define paths to system binaries
MYSQL="/usr/bin/mysql"
MYSQLDUMP="/usr/bin/mysqldump"
GZIP="/bin/gzip"
MAIL="/bin/mailx"
# MySQL credentials used for reading the databases.
# either the MySQL DBA account "root"
# or alternatively create a dedicated read-only backup user
# with the following GRANT statement:
# mysql> GRANT SELECT,RELOAD,SUPER,REPLICATION CLIENT ON *.* TO \
# backupuser@<this IP or localhost> identified by 'Very_s3cr3t_passW0rd';
MYHOST="localhost" # localhost or remote ip-address
MYUSER="backupuser"
MYPASS="Very_s3cr3t_passW0rd"
# Local filesystem or network share to dump back-ups
# Good practice to have file back-ups on their own filesystem
# and not on the root filesystem.
MYBAKDIR="/backups"
# Keep 1 week worth of MySQL backups under $MYBAKDIR
MYDIR=$(date +MySQL/%A)
# Mail errors to somebody in charge
[email protected]
# The rest shouldn't need much tuning
#=====================================================================
errormail(){
cat << EOF | $MAIL -s "MySQL back-up failed !" $ERROR_RCPT
This is an automatic warning message.
The MySQL back-up on server: $(hostname) has failed with the following
errors:
$1
Please take appropiate action.
Thanks in advance.
EOF
exit 1 ;
}
if ! test -d $MYBAKDIR ; then
mkdir -p $MYBAKDIR || errormail "Backup directory $MYBAKDIR does not exist and could not be created."
fi
if test -d "$MYBAKDIR/$MYDIR" ; then
rm -rf "$MYBAKDIR/$MYDIR" || errormail "Expired backups from $MYBAKDIR/$MYDIR could not be removed."
fi
mkdir -p "$MYBAKDIR/$MYDIR" || errormail "Todays backup directory $MYBAKDIR/$MYDIR could not be created."
# Generate list with all databases
DATABASES=$(echo "show databases" | $MYSQL -h $MYHOST -u $MYUSER -p$MYPASS |grep -v ^Database$) || errormail "Unable to connect to MySQL database server on $MYHOST please check the supplied credentials"
# Make a logical backup of each database
for DB in $DATABASES
do
$MYSQLDUMP -h $MYHOST -u $MYUSER -p$MYPASS --opt --single-transaction $DB > $MYBAKDIR/$MYDIR/$DB.sql || errormail "Unable to create backup from $DB "
$GZIP $MYBAKDIR/$MYDIR/$DB.sql || errormail "Unable to compress $MYBAKDIR/$MYDIR/$DB.sql "
done