目前流行几种备份方式:
1, 逻辑备份: 使用 MySQL 自带的 mysqldump 工具进行备份. 备份成 sql 文件形式.
优点: 最大好处是能够与正在运行的 MySQL 自动协同工作,
在运行期间可以确保备份是当时的点, 它会自动将对应操作的表锁定, 不允许其他用户修改(只能访问). 可能会阻止修改操作. sql 文件通用方便移植.
缺点: 备份的速度比较慢. 如果是数据量很多的时候. 就很耗时间. 如果数据库服务器处在提供给用户服务状态, 在这段长时间操作过程中, 意味着要锁定表(一般是读锁定, 只能读不能写入数据). 那么服务就会影响的.
备注: 所谓的与 MySQL 服务器能够自动协同工作, 实际上是指加参数来控制 MySQL 服务器, 比如锁定所有表只能进行读, 不能进行写操作.
--lock-all-tables
2, 物理备份: 直接拷贝 MySQL 的数据目录.
直接拷贝只适用于 myisam 类型的表. 这种类型的表是与机器独立的. 但实际情况是, 你设计数据库的时候不可能全部使用 myisam 类型表. 你也不可能: 因为 myisam 类型表与机器独立, 方便移植, 于是就选择这种表, 这并不是选择它的理由.
缺点: 你不能去操作正在运行的 MySQL 服务器 (在拷贝的过程中有用户通过应用程序访问更新数据, 这样就无法备份当时的数据) 可能无法移植到其他机器上去.
更多的情况是, 你会根据业务特点(比如你需要支持事务机制就必须使用 innodb), 查询速度和服务性能来选择表类型的.
必须保证表不被使用中.
如果服务器在你正在拷贝一个表时 (某个用户在进行 update,insert 操作) 改变它, 拷贝的数据就失去了备份的意义(没法准确还原到当时的点).
如果数据库表在文件系统备份过程中被修改, 进入备份的表文件主语不一致的状态, 而对以后的恢复表将失去意义.
保证你的拷贝完整性的最好方法是: 关闭服务器, 拷贝文件, 然后重启服务器.
或者是, 要锁定对应的表(对前端用户造成访问问题).
解释直接拷贝文件, 为什么不具备可移植性?
mysqldump 产生可移植到其他机器, 甚至具有不同硬件结构的机器上的文本文件. 直接拷贝文件不能够移植到其他机器上, 除非要拷贝的表使用 MyISAM 存储格式. ISAM 表只能在具有相同硬件结构的机器之间进行拷贝. 例如, 将文件从 S PARC 的 Solaris 机器拷贝到 Intel 的 Solaris 机器 (或者相反) 是行不通的. 由 MySQL3.23 引进的 MyISAM 表存储格式可以解决这个问题, 因为该格式与机器独立. 因此, 如果以下两个条件都满足的话, 直接拷贝文件可以移植到具有不同硬件结构的机器上: 即另一台机器上也必须运行 MySQL3.23 以上的版本, 并且文件必须表示成 MyISAM 表, 而不是 ISAM 表.
3, 双机热备份.
MySQL 数据库没有增量备份的机制. 当数据量太大的时候备份是一个很大的问题. 还好 MySQL 数据库提供了一种主从备份的机制(也就是双机热备)
优点: 适合数据量大的时候. 现在明白了. 大的互联网公司对于 MySQL 数据备份, 都是采用热机备份. 搭建多台数据库服务器, 进行主从复制.
主从复制经常遇到的问题就是, 如何保证数据不堵塞, 不延迟. 这个问题还是可以容忍的, 有一些方案可以改善. 毕竟有得有失的. 这已经是很省心省力的方式了.
我目前应该使用什么样的备份策略的权衡:
物理备份, 恢复快, 当然最好是存储在一个机器上. 我现在是用物理备份还是逻辑备份为好呢?
考虑到以后会迁移平台. 为了保证通用性. 恢复速度 1 分钟左右的差距我是可以容忍的(sql 文件备份方式, 恢复速度没有物理配备快, 物理备份直接拷贝覆盖掉原来文件即可). 所以我为了跨平台, 我更加愿意使用逻辑备份. 存储 sql 文件形式.
双热机备份方式, 目前硬件没有多个. 技术人员有限, 需要人力去维护, 比较麻烦. 所以排除在外.
方案:
1, 总体策略: 写个定时执行任务. 定时在晚上或凌晨自动备份(考虑数据库服务器在运行中不能停机)
代码中做成备份成功后, 把以前的删掉. 避免很多数据占据磁盘.
2, 考虑到初期数据量这么小. 使用 mysqldump 进行备份吧. 设置在凌晨几点 (4-6 点这个时候基本上没什么人访问) 的时候自动备份.
3, 使用逻辑备份方式: 恢复速度 1 分钟左右的差距我是可以容忍的. 所以我为了跨平台, 我更加愿意使用逻辑备份. 存储 sql 文件形式.
4, 每天都进行备份. 由于是在凌晨的时候 mysqldump 去锁定, 访问数据库服务器. 对服务器几乎没什么影响. 所以每天都可以备份. 每天都一个 sql 文件. 那么将会很多文件.
所以, 每次备份成功后. 删除以前的文件. 保留最近一个星期的备份 sql 文件.
备份工具的路径:/usr/bin/mysqldump
备份数据保存路径:/data/backdata/
5, 备份脚本的编写
思路:
5.1 在 shell 脚本中调用 mysqldump 生成备份文件(这个工具可以生成 sql 文件到磁盘上去)
5.2 为了方便以后查找. 每次备份的记录记录成日志形式. 几点进行了备份操作, 生成了什么文件名称. 这样可以方便以后查阅哪天是否没有成功备份
删除的文件作为日志信息也记录下来.
5.3 让 Linux 下的 crontab 进程调用脚本执行.
命令: crontab -e
打开的文件中加入代码: 0 05 * * * 脚本的路径 / mysqlback.sh
mysqlback.sh 的内容:
- # /bin/bash
- DB_NAME="****"
- DB_USER="****"
- DB_PASS="****"
- BIN_DIR="/usr/bin"
- BACK_DIR="/data/backdata"
- DATE="mysql-`date +'%Y%m%d-%H:%M:%S'`"
- LogFile="$BACK_DIR"/dbbakup.log #日志记录保存的目录
- BackNewFile=$DATE.sql
- $BIN_DIR/mysqldump --opt --force -u$DB_USER -p$DB_PASS $DB_NAME> $BACK_DIR/$DATE.sql
- echo -----------------------"$(date +"%y-%m-%d %H:%M:%S")"----------------------->> $LogFile
- echo createFile:"$BackNewFile">> $LogFile
- #find "/data/backdata/" -cmin +1 -type f -name "*.sql" -print> deleted.txt
- #-ctime 表示创建时间, 这里表示删除创建时间为多少天之前的文件, 也就是结果只保留多少天的数据
- find "/data/backdata/" -ctime +7 -type f -name "*.sql" -print> deleted.txt
- echo -e "delete files:\n">> $LogFile
- # 循环删除匹配到的文件
- cat deleted.txt | while read LINE
- do
- rm -rf $LINE
- echo $LINE>> $LogFile
- done
- echo "---------------------------------------------------------------">> $LogFile
转载请注明来源网站: www.itxm.cn 谢谢!
来源: http://www.bubuko.com/infodetail-3091050.html