对于任何数据库来说,备份都是非常重要的
数据库复制不能取代备份的作用
比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据可能也已经被删除了,
我们不能使用从数据库上的数据来恢复主数据库上的数据,只能通过备份进行误删除数据的恢复
其备份结果为SQL语句,适合于所有存储引擎,恢复时需要较多时间,逻辑备份时,对于MyISAM存储引擎是需要进行锁表操作的,通过使用的MySQLdump就是一种逻辑备份工具
物理备份是对数据库目录的拷贝,其备份结果的大小通常也与备份数据的数据目录大小相同,物理备份和恢复通常比逻辑备份要快,因为只需要对mysql数据目录拷贝即可,也正是因为这点,对于内存表只能备份其结构,无法备份数据(因为其数据存储在内存中,没有实际的物理数据文件)
物理备份的方式 进行物理备份,我们可以采用离线备份和在线备份的方式进行备份 离线备份:需要对数据库进行停机,或对整个数据库进行锁定的情况下进行 在线备份:需要使用第三方工具,如 XtraBackup 2. 按备份的数据库的内容来分 2.1 全量备份是对整个数据库的一个完整备份
2.2 增量备份是在上次全量或增量备份的基础上,对更改过的数据进行的备份
注意Mysql官方提供的mysqldump命令并不支持增量备份
通常情况要使用mysqldump来进行增量备份的话,增量备份只能通过备份Mysql的二进制日志来实现
XtraBackup本身就提供了增量备份的功能,所以对于Innodb来说,使用XtraBackup进行备份更加安全高效
无论是使用XtraBackup还是Mysqldump 进行备份,要进行基于时间点的恢复时都需要利用Mysql的二进制日志,所以通常情况下我们需要对Mysql的二进制日志也进行备份
二. 使用mysqldump进行备份mysqldump 是mysql官方提供的逻辑备份工具,其备份结果是可读的SQL文件
mysqldump 支持多种语法
1. 常用语法 对一个数据库下的一个或多个表进行备份 mysqldump [OPTIONS] database [tables]备份多个表时,table直接用空格进行分隔
对指定的多个数据库进行备份 mysqldump [OPTIONS] --database [OPTIONS] DB1 [DB2..] 对整个mysql实例下的所有数据库进行备份 mysqldump [OPTIONS] --all-database [OPTIONS] 2. 常用参数 -u,--user = name # 指定备份时所使用的数据库账号 -p. --password [=name] # 指定账号的密码 --single-transaction # 使用此参数会在备份前先执行start transaction命令启动一个事务,以此来获得数据库备份时的数据的一致性,由于是通过事务保证数据的一致性,所以此参数只对Innodb存储引擎有效;当使用此参数进行备份时,要确保没有任何DDL语句在执行,因为Innodb的数据一致性的隔离级别并不能隔离DDL操作 -l, --lock-tables # 如果没有使用非事务存储引擎,使用此参数保证备份时数据的一致性,在备份时会依次锁住每个数据库下的所有表,一般用于MyISAM存储引擎的备份,使用了此参数,在数据库备份时,只能进行读操作,由于此参数是锁住一个数据库下的所有表,备份时可以保证一个数据库下的所有表的数据一致性,但不能保证整个Mysql实例下的所有数据库的所有表的数据一致性,这也是为什么推荐使用Innodb引擎的一个原因 lock-tables 与 single-transaction 参数是互斥的,不能同时使用,所以数据库中如果混合使用了Innodb表和MyISAM表就只能使用lock-tables来进行备份了 -x, --lock-all-tables # 此参数可以对整个Mysql实例下的所有数据库进行加锁,可以避免lock-tables不能保证整个Mysql实例下的所有数据库的所有表的数据一致性的问题,备份时同样会将数据库变为只读的状态 --master-data = [1/2] # 无论是时间恢复还是新建slave实例都要用到这个参数,此参数有两个可选值,当值为1时,备份中只记录change_master语句,当值为2时,change_master语句会以注释的形式出现在备份文件中;默认值为1,且当使用了此参数时会忽略lock-tables参数,在备份时如果使用了此参数,但是没有使用single-transaction参数,则会自动使用lock-all-tables参数 如果我们要备份的数据库中包含了存储过程,触发器,数据库调度事件时,要备份这些数据库对象时,必须指定以下参数才能对相应数据库进行备份 -R, --routines # 指定要备份的数据库中存在的的存储过程 --triggers # 指定要备份的数据库中存在的的触发器 -E,--events # 指定要备份的数据库中存在的的调度事件 除了以上参数,还有一些参数在备份时也会用到 --hex-blob # 因为mysqldump备份导出的是文本文件,如果导出的数据中含有以上类型,在文本格式下,有些字符是不可见的,如果使用了此参数使,将会对数据库中所存在binary、varbinary、blob类型的数据以16进制的形式保存,就不会出现有些字符不可见的情况了 --tab =path # 使用了此参数会在指定的路径下对数据库的每个表生成两个文件,一个文件用于存储表结构,另一个用于存储表中的数据 -w, --where = '过滤条件' # 导出指定条件的数据(只支持单表数据条件导出) 备份账号所需要的权限 : SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, PROCESS 如果使用--tab参数则还需要:FILE权限 3. 演示 首先创建备份用户 create user 'backup'@'localhost' identified by '123456'; 赋予用户备份权限 grant select,reload,lock tables,replication client,show view,event,process on *.* to 'backup'@'localhost'; 使用mysqldump进行全量备份 备份某个数据库 [root@localhost db_backup]# mysqldump -ubackup -p --master-data=2 --single-transaction --routines --triggers --events mc_orderdb > mc_orderdb.sql 如果遇到以下问题 mysqldump: Error: Binlogging on server not activeMySQL中二进制日志功能默认是关闭,去/etc/my.cnf 文件中加入下面配置,开启log_bin(数据库的操作日志)功能,然后重启mysql即可解决问题
log_bin=mysql-bin