MySQL的备份包括逻辑备份和物理备份
逻辑备份是指备份产生数据的语句,如CREATE DATABASE,CREATE TABLE和INSERT,把这些语句导出,然后存储到一个脚本中。恢复时,把这个脚本导入到数据库。有很强的兼容性,甚至可以跨平台备份和恢复。
物理备份指把对应的数据库文件拷贝到其他地方。可以跨平台备份和恢复。
MySQL的备份也可以分为完全备份,增量备份等
MySQL的备份分为热备份(Hot backup,支持读和写),温备份(Warm backup,只支持读),冷备份(Cold backup ,不支持读和写)
备份内容:二进制日志(主要用于增量备份,或建立从服务器),InnoDB日志文件(用于物理备份),MySQL的配置文件(如/etc/my.cnf),从服务器的上的slave position information 和relay logs ,及数据库本身。
备份工具:mysqldump (逻辑备份工具),SELECT INTO OUTFILE(逻辑备份工具),mk-parallel-backup(可以实现并行备份,要求cpu是多核的,第三方工具),ibbackup(专用于INNODB),BACKUP(MySQL 6.0以上才有此工具),Snapshot,mysqlhotcopy(MyISAM)
mysqldump命令
db_name[tb1][tb2] 指定数据库中的表
--all-databases 备份所有数据库
--databases 指定数据库
--events 导出 CREATE EVENT语句
--extended-insert
--flush-logs 用于日志滚动
--insert-ignore 用insert-ignore代替insert
--lock-all-tables 锁定所有表
--lock-tables 锁定某一表
--master-data=n 导出二进制文件名称和位置,n=1时,改变主服务器,n=2时,不再改变主服务器
--no-data 不备份数据
--opt
等同于同时添加
--add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用
--replace 用REPLACE代替INSERT,由插入语句改为替换语句
--routines 导出自定义函数和存储过程
--single-transaction 在导出数据之前提交一个
BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如
InnoDB 和 BD
--triggers 导出触发器,该选项默认启用,用
--ski禁用它p-triggers
--where 指定导出表中的哪些数据
如:mysqldump --databases mysql test > test.sql;
mysqldump mysql --where=”name=’user’” >test.sql;
在很多情况下需要用到管理员账号和密码,如:
mysqldump -uroot –p --all-databases > dump.sql;
mysqldump -uroot -p mydb t1 > mydb.sql;
恢复和还原:
方式1>mysql -uroot –p db_name < db.name.sql
方式2>SOURCE /tmp/db_name.sql;
SELECT INTO OUTFILE 命令:
如:SELECT * INTO OUTFILE ‘/tmp/t1.txt’ FROM t1;
恢复: LOAD DATA INFILE ‘/tmp/t1.txt’ INTO TABLE t1;
mk-parallel-dump 命令:(http://www.maatkit.org/)
使用方式 mk-parallel-dump --basedir=/backups
恢复 mk-parallel-restore /backups
文件系统快照(file system snapshot)
mysqlhotcopy 命令:
--addtodest 把备份结果添加到某一目录下
--allowold 如果该目录已存在,就把原目录重命名,放到一旁
--checkpoint=db_name.table_name
--dryrun
测试
--flushlogs 日志滚动
--keepold 不删除原有的备份文件
--method 取值cp或scp,可以远程备份
--regexp 支持正则表达式选择匹配的数据库或表
--resetmaster 表被锁定后,运行 RESET MASTER命令,重新设置二进制日志
--resetsalve 表被锁定后,运行 RESET SLAVE命令
如:
mysqlhotcopy mydb /backup
mysqlhotcopy --method=scp mydb [email protected]:/backup 备份到远程主机
恢复与还原
mysqlhotcopy
备份出来的是整个数据库目录,使用时可以直接拷贝到
mysqld
指定的
datadir (在这里是
/usr/local/mysql/data/)目录下即可,要注意权限的问题
cp –rf db_name /usr/local/mysql/data/
chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成
mysqld
运行用户)
MySQL的还原:
mysqlbinlog
--start-datetime=”date_time”
--stop-datetime=”date_time”
--start-position=start_log_position
--stop-position=stop_log_position
1>时间点还原
1)还原整个数据库
2)还原二进制日志(以数字结尾),按顺序还原
mysqlbinlog mysql-bin.000003 > mysql-bin.000003.sql
mysqlbinlog –stop-datetime=’2009-08-20 15:42:48’ mysql-bin.000002 > mysql-bin.000002.sql
replication (复制)
MySQL支持两种复制,基于语句复制(MySQL 3.23 后)和基于行的复制(MySQL 5.1后)
为何使用复制
1 数据的异地分布 2本地服务器平衡 3 备份 4 高可用和故障转移 5 测试升级
replication 工作
1) 主服务器记录数据到二进制日志
2) 从服务器复制此二进制日志到重置日志(Relay log)
3) 从服务器把重置日志写入数据库
主服务器:
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO test@’192.168.0.%’ IDENTIFIED BY ‘password’;
log_bin =mysql-bin
server_id =10
重新启动MySQL
mysql> SHOW MASTER STATUS;
从服务器:
log_bin =mysql-bin
server_id =2
relay_log =mysql-relay-bin
log_slave_updates =1
read_only =1
mysql>CHANG MASTER TO MASTER_HOST=’server1’,
->MASTER_USER=’test’,
->MASTER_PASSWORD=’password’,
->MASTER_LOG_FILE=’mysql-bin.000001’,
->MASTER_LOG_POS=0;
SHOW SLAVE STATUS\G
start slave