一先建立备份账号
create user 'backup'@'localhost' identified by 'pass4word';
二赋予权限
grant select,reload,lock tables,replication client,show view,event,process on *.* to 'backup'@'localhost';
附加,查看创建表的语句
show create table table_name;
三备份单个数据库
mysqldump -ubackup -ppass4word --master-data=2 --single-transaction --routines --triggers --events tk_test >tk.sql
详解
备份分类
按照是否能继续提供服务
- 热备 :在线备份,能读能写.
- 冷备 :离线备份
按照备份数据库对象分类
- 物理备份:对数据库目录的拷贝,速度较快,对于内存表只备份结构。
- 逻辑备份:备份的结果为SQL语句.适合于所有存储引擎。相比物理备份而言速度较慢。
按照备份数据量
- 全量备份
- 增量备份
备份内容和备份工具
需要备份的内容:文件,二进制日志,事务日志,配置文件,操作系统上和MySQL相关的配置
备份工具:
mysqldump:逻辑备份工具.要求MySQL服务在线. MyIsam(温备,可读不可写), InnoDB(热备,可读可写)
cp :冷备份
lvm快照:几乎热备.注意点是 ,先flush table,lock table,创建快照,释放锁,复制数据.因为要先flush table 和lock table,这对于MyISAM来说很简单很容易实现.但对于InnoDB来说,因为事务的原因,锁表后可能还有缓存中的数据在写入文件中,所以应该监控缓存中的数据是否真的已经完全写入数据文件中,之后才能进行复制数据
xtrabackup:开源 .MyISAM(温备),InnoDB(热备),速度较快
语法选项
- mysqldump [OPTIONS] database_name [tables]
mysqldump -ubackup -ppass4word tk_test2 tk_test >back.sql
-
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3 ..]
-
mysqldump -ubackup -ppass4word --database tk_test2 tk_test >back.sql
- mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump -ubackup -ppass4word --all-databases > m2.sql;
连接选项
-u , --user=name #指定用户名
-S, --socket=name #指定套接字路径
-p, --password[=name] #指定密码
-P, --port=# #指定端口号
-h, --host=name #指定主机名
-r ,--result-file=name
将结果保存到指定的文件中,在Linux中等同于覆盖重定向.在windows中因为回车符 的原因,使用该选项比重定向更好
筛选选项
--all-databases, -A
指定dump所有数据库,
--databases, -B
指定需要dump的库,该选项后所有内容都被当成数据库名,在输出文件中的每个数据库前会加上建库语句和use语句
--ignore-table=db_name.tbl_name
导出时忽略指定数据库中的指定表,同样可以用于忽略视图,要忽略多个则多次写该选项
-d, --no-data
不导出表数据,可以用在仅导出表结构的情况
--hex-blob
将binary varbinary,blob,bit类型导出为十六进制
--events,-E
导出时间调度器
--routines,-R
导出存储过程和函数,但不会导出它们的属性值,若要导出它们的属性,可以导出mysql,proc表然后reload
--triggers
导出触发器,默认已开启
--tables
覆盖 --databases选项,导出指定表,但这样只能导出一个库中的表.格式为--tables database_name table_name1 table_name2
--where='where_condition' ,-w 'where_conditdion'
指定筛选条件并导出表中符合筛选的数据.如--where="user='张三'"
字符集选项
--default-character-set=charset_name
在导出数据的过程中,指定导出的字符集.客户端服务端字符集不同导出时可能乱码,默认使用utf8
--set-charset
在导出结果中加上 set names charset_name语句.默认启用
复制选项
--master-data[=value]
该选择主要用来建立以个replication,当值为1时,导出文件中记录change master语句;
当值为2时,change master语句被写成注释语句,默认值为空
该选项会自动忽略--lock-tables,当没有使用 --single-transaction时自动启用 --lock-all-tables
比如要导出we7库下member表中部分数据,完整的加where语句的用法
将会导出ims_kz_mgcjbp_member表中 id >3300 并且id 小于3360下的所有数据
mysqldump -uroot -proot --master-data=2 --single-transaction --events --triggers --routines --where 'id >3300 and id <3360' we7 ims_kz_mgcjbp_member > member.sql
--tab,-T
为每个表在给定路径创建tab分割的文本文件, 注意:仅仅用于Mysqldump和mysqld服务器运行在相同机器上
mysqldump -uroot -proot --master-data=2 --single-transaction --events --triggers --routines --where 'id >3300 and id <3360' we7 ims_kz_mgcjbp_member --tab='/data/backup'
上面的命令则会在data/backup 目录下生成 ims_kz_mgcjbp_member.sql,ims_kz_mgcjbp_member.txt文件.
mysqldump使用建议
从性能角度考虑:在需要导出大量数据的时候,使用--quick选项可以加速导出,但导入熟读不变,如果是innodb表,则可以同时加上--no-autocommit选项,这样大数据量导入时将极大提升性能