我正在使用 mysql
您多久备份一次数据库?
您通常如何备份数据库?
将所有数据导出为 sql 或 cvs 格式并将其保存在文件夹中??
答案1
如果您想正确执行 MySQL 备份,而无需停机,则应将数据库复制到备用服务器。它不需要非常强大,只需能够应付主数据库的写入负载即可。您不应该在生产中使用此服务器。如果复制永远跟不上,则需要更强大的服务器。您可以通过比较日志文件和输出中的位置来进行检查
> SHOW MASTER STATUS\G
在主人和
> SHOW SLAVE STATUS\G
在从服务器上。我认为 MySQL5 将显示滞后SHOW SLAVE STATUS
。
当你对你的奴隶保持同步感到高兴时,你可以通过以下方式进行备份
SLAVE STOP;
在从服务器上停止复制mysqldump --opt
在从属服务器上执行。SLAVE START;
在从服务器上重新启动复制
如果您这样做,那么您将拥有一致的数据库备份。此方法可防止不同数据库甚至更糟的同一数据库中的不同表不同步,并通过在备份时锁定表以进行写入来防止停机。
这种设置的一大好处是,您拥有一个数据库副本,您可以用它运行耗时较长且成本高昂的查询,而这不会影响您的实时服务。
一些随机提示:
- 不要试图对 mysql 数据文件进行基于文件的备份。这样做弊大于利,而 MySQL 转储则更加灵活。
- 在转储过程中,请注意 mysqldump 锁定表。
- 除非你在转储过程中锁定每个表,否则请注意转储中的不一致问题
- 使用
mysqldump --opt
,因为它通常是导入结果 SQL 的最快方法 - 尽可能多地转储。我们每天都会转储,因为我们有 40GB 以上的数据。
- 偶尔在备用服务器上测试您的转储以确保它们可以正常工作。
答案2
我使用一个脚本,用于mysqldump
将数据/架构提取到每个数据库的文件中。数据通过常规的 netbackup 备份到磁带。您显然可以添加更多花哨的功能,但这只是一个基本的转储。
#!/bin/sh
# Find out what databases are in mysql and back them up
# Delete old backups
STARTTIME=` date +%Y%m%d-%H%M `
#BACKUP_DIR="/usr/local/db_backups"
BACKUP_DIR="/var/local/db_backups"
LOGFILE="/var/log/db_backups.log"
USER="root"
PASSWD="<password>"
KEEP="7"
(
echo
echo " ---MySQL backups start ${STARTTIME} ---"
#delete any backup written more than ${KEEP} days ago
echo "Removing files over ${KEEP} days old from ${BACKUP_DIR}:"
/usr/bin/find ${BACKUP_DIR} -mindepth 1 -mtime +${KEEP} -print -delete
echo
echo "Performing today's dumps"
#find each database running in this instance of mysl
for DB in ` echo "show databases;"|mysql -u${USER} -p${PASSWD} mysql |awk " NR>1 {print $1} " `
do
#generate a backup file name based on the data base name
BACKUP_FILE="${BACKUP_DIR}/${DB}-${STARTTIME}.sql"
echo "Processing database ${DB} into file ${BACKUP_FILE}"
# dump the database data/schema into the backup file
mysqldump -u${USER} -p${PASSWD} --add-drop-table ${DB} > ${BACKUP_FILE}
gzip ${BACKUP_FILE}
done
ENDTIME=` date +%Y%m%d-%H%M `
echo
echo " ---MySQL backups complete ${ENDTIME} ---"
echo
) >> ${LOGFILE} 2>&1