Focus On Oracle

Installing, Backup & Recovery, Performance Tuning,
Troubleshooting, Upgrading, Patching

Oracle Engineered System


当前位置: 首页 » 技术文章 » MySQL

MySQL备份

MySQL的备份方式有:mysqldump,SQL语句备份(backup table/select into outfile),mysqlhotcopy,直接拷贝数据文件和相关的文件,备份二进制日志(binlog),Oracle还引入了mysqlpump。MyISAM表是保存成文件的形式,相对来说比较容易备份。Innodb所有的表都保存在同一个数据文件ibdata1中(也可能是多个文件,或者是独立的表空间文件innodb_file_per_table),相对来说比较不好备份。

各种备份方式的优劣

 MySQL备份工具
备份方法 存储引擎 备份方式 备份速度 恢复速度
mysqldump ALL WARM MEDUIM SLOWEST
mysqldump INNODB HOT MEDUIM SLOWEST
select into outfile  ALL WARM SLOW SLOW
backup command in mysqld ALL HOT FAST FAST
filesystem (copy files) ALL COLD FASTEST FASTEST
mysqlhotcopy MyISAM MOSTLY COLD FAST FAST

hot backup  在线备份数据库,数据库可以读写
warm backup  数据库在运行时,可在线备份数据库,但是只读,不能写入数据
cold backup  是指在数据库关闭后才开始备份

A.mysqldump是采用SQL级别的备份机制,它将数据表导成SQL脚本文件,在不同的MySQL版本之间升级时使用比较不错
--hex-blob
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB
--lock-all-tables(-x)
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction和--lock-tables选项。
--lock-tables
和--lock-all-tables类似,只锁定当前导出的数据表,而不是锁定全部库下的表。只适用于MyISAM表,如果是Innodb表可以用--single-transaction选项
--no-create-info(-t)
只导出数据,不创建create table语句
--no-data(-d)
只导出数据库表结构
--quick(-q)
在导出大表时很有用,它强制mysqldump从服务器取得记录后直接输出而不是获取所有记录后,再将它们缓存到内存中
--routines(-R)
导出存储过程以及函数
[root@mysql mysql]# mysqldump --help
mysqldump  Ver 10.13 Distrib 5.7.16, for Linux (x86_64)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Dumping structure and contents of MySQL databases and tables.
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
The following groups are read: mysqldump client
The following options may be given as the first argument:
--print-defaults        Print the program argument list and exit.
--no-defaults           Don't read default options from any option file,
                        except for login file.
--defaults-file=#       Only read default options from the given file #.
--defaults-extra-file=# Read this file after the global files are read.
--defaults-group-suffix=#
                        Also read groups with concat(group, suffix)
--login-path=#          Read this path from the login file.
  -A, --all-databases Dump all the databases. This will be same as --databases
                      with all databases selected.
  -Y, --all-tablespaces
                      Dump all the tablespaces.
  -y, --no-tablespaces
                      Do not dump any tablespace information.
  --add-drop-database Add a DROP DATABASE before each create.
  --add-drop-table    Add a DROP TABLE before each create.
                      (Defaults to on; use --skip-add-drop-table to disable.)
  --add-drop-trigger  Add a DROP TRIGGER before each create.
  --add-locks         Add locks around INSERT statements.
                      (Defaults to on; use --skip-add-locks to disable.)
  --allow-keywords    Allow creation of column names that are keywords.
  --apply-slave-statements
                      Adds 'STOP SLAVE' prior to 'CHANGE MASTER' and 'START
                      SLAVE' to bottom of dump.
  --bind-address=name IP address to bind to.
  --character-sets-dir=name
                      Directory for character set files.
  -i, --comments      Write additional information.
                      (Defaults to on; use --skip-comments to disable.)
  --compatible=name   Change the dump to be compatible with a given mode. By
                      default tables are dumped in a format optimized for
                      MySQL. Legal modes are: ansi, mysql323, mysql40,
                      postgresql, oracle, mssql, db2, maxdb, no_key_options,
                      no_table_options, no_field_options. One can use several
                      modes separated by commas. Note: Requires MySQL server
                      version 4.1.0 or higher. This option is ignored with
                      earlier server versions.
  --compact           Give less verbose output (useful for debugging). Disables
                      structure comments and header/footer constructs.  Enables
                      options --skip-add-drop-table --skip-add-locks
                      --skip-comments --skip-disable-keys --skip-set-charset.
  -c, --complete-insert
                      Use complete insert statements.
  -C, --compress      Use compression in server/client protocol.
  -a, --create-options
                      Include all MySQL specific create options.
                      (Defaults to on; use --skip-create-options to disable.)
  -B, --databases     Dump several databases. Note the difference in usage; in
                      this case no tables are given. All name arguments are
                      regarded as database names. 'USE db_name;' will be
                      included in the output.
  -#, --debug[=#]     This is a non-debug version. Catch this and exit.
  --debug-check       This is a non-debug version. Catch this and exit.
  --debug-info        This is a non-debug version. Catch this and exit.
  --default-character-set=name
                      Set the default character set.
  --delete-master-logs
                      Delete logs on master after backup. This automatically
                      enables --master-data.
  -K, --disable-keys  '/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and
                      '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put
                      in the output.
                      (Defaults to on; use --skip-disable-keys to disable.)
  --dump-slave[=#]    This causes the binary log position and filename of the
                      master to be appended to the dumped data output. Setting
                      the value to 1, will printit as a CHANGE MASTER command
                      in the dumped data output; if equal to 2, that command
                      will be prefixed with a comment symbol. This option will
                      turn --lock-all-tables on, unless --single-transaction is
                      specified too (in which case a global read lock is only
                      taken a short time at the beginning of the dump - don't
                      forget to read about --single-transaction below). In all
                      cases any action on logs will happen at the exact moment
                      of the dump.Option automatically turns --lock-tables off.
  -E, --events        Dump events.
  -e, --extended-insert
                      Use multiple-row INSERT syntax that include several
                      VALUES lists.
                      (Defaults to on; use --skip-extended-insert to disable.)
  --fields-terminated-by=name
                      Fields in the output file are terminated by the given
                      string.
  --fields-enclosed-by=name
                      Fields in the output file are enclosed by the given
                      character.
  --fields-optionally-enclosed-by=name
                      Fields in the output file are optionally enclosed by the
                      given character.
  --fields-escaped-by=name
                      Fields in the output file are escaped by the given
                      character.
  -F, --flush-logs    Flush logs file in server before starting dump. Note that
                      if you dump many databases at once (using the option
                      --databases= or --all-databases), the logs will be
                      flushed for each database dumped. The exception is when
                      using --lock-all-tables or --master-data: in this case
                      the logs will be flushed only once, corresponding to the
                      moment all tables are locked. So if you want your dump
                      and the log flush to happen at the same exact moment you
                      should use --lock-all-tables or --master-data with
                      --flush-logs.
  --flush-privileges  Emit a FLUSH PRIVILEGES statement after dumping the mysql
                      database.  This option should be used any time the dump
                      contains the mysql database and any other database that
                      depends on the data in the mysql database for proper
                      restore.
  -f, --force         Continue even if we get an SQL error.
  -?, --help          Display this help message and exit.
  --hex-blob          Dump binary strings (BINARY, VARBINARY, BLOB) in
                      hexadecimal format.
  -h, --host=name     Connect to host.
  --ignore-error=name A comma-separated list of error numbers to be ignored if
                      encountered during dump.
  --ignore-table=name Do not dump the specified table. To specify more than one
                      table to ignore, use the directive multiple times, once
                      for each table.  Each table must be specified with both
                      database and table names, e.g.,
                      --ignore-table=database.table.
  --include-master-host-port
                      Adds 'MASTER_HOST=<host>, MASTER_PORT=<port>' to 'CHANGE
                      MASTER TO..' in dump produced with --dump-slave.
  --insert-ignore     Insert rows with INSERT IGNORE.
  --lines-terminated-by=name
                      Lines in the output file are terminated by the given
                      string.
  -x, --lock-all-tables
                      Locks all tables across all databases. This is achieved
                      by taking a global read lock for the duration of the
                      whole dump. Automatically turns --single-transaction and
                      --lock-tables off.
  -l, --lock-tables   Lock all tables for read.
                      (Defaults to on; use --skip-lock-tables to disable.)
  --log-error=name    Append warnings and errors to given file.
  --master-data[=#]   This causes the binary log position and filename to be
                      appended to the output. If equal to 1, will print it as a
                      CHANGE MASTER command; if equal to 2, that command will
                      be prefixed with a comment symbol. This option will turn
                      --lock-all-tables on, unless --single-transaction is
                      specified too (in which case a global read lock is only
                      taken a short time at the beginning of the dump; don't
                      forget to read about --single-transaction below). In all
                      cases, any action on logs will happen at the exact moment
                      of the dump. Option automatically turns --lock-tables
                      off.
  --max-allowed-packet=#
                      The maximum packet length to send to or receive from
                      server.
  --net-buffer-length=#
                      The buffer size for TCP/IP and socket communication.
  --no-autocommit     Wrap tables with autocommit/commit statements.
  -n, --no-create-db  Suppress the CREATE DATABASE ... IF EXISTS statement that
                      normally is output for each dumped database if
                      --all-databases or --databases is given.
  -t, --no-create-info
                      Don't write table creation info.
  -d, --no-data       No row information.
  -N, --no-set-names  Same as --skip-set-charset.
  --opt               Same as --add-drop-table, --add-locks, --create-options,
                      --quick, --extended-insert, --lock-tables, --set-charset,
                      and --disable-keys. Enabled by default, disable with
                      --skip-opt.
  --order-by-primary  Sorts each table's rows by primary key, or first unique
                      key, if such a key exists.  Useful when dumping a MyISAM
                      table to be loaded into an InnoDB table, but will make
                      the dump itself take considerably longer.
  -p, --p[=name]
                      Password to use when connecting to server. If password is
                      not given it's solicited on the tty.
  -P, --port=#        Port number to use for connection.
  --protocol=name     The protocol to use for connection (tcp, socket, pipe,
                      memory).
  -q, --quick         Don't buffer query, dump directly to stdout.
                      (Defaults to on; use --skip-quick to disable.)
  -Q, --quote-names   Quote table and column names with backticks (`).
                      (Defaults to on; use --skip-quote-names to disable.)
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -r, --result-file=name
                      Direct output to a given file. This option should be used
                      in systems (e.g., DOS, Windows) that use carriage-return
                      linefeed pairs (\r\n) to separate text lines. This option
                      ensures that only a single newline is used.
  -R, --routines      Dump stored routines (functions and procedures).
  --set-charset       Add 'SET NAMES default_character_set' to the output.
                      (Defaults to on; use --skip-set-charset to disable.)
  --set-gtid-purged[=name]
                      Add 'SET @@GLOBAL.GTID_PURGED' to the output. Possible
                      values for this option are ON, OFF and AUTO. If ON is
                      used and GTIDs are not enabled on the server, an error is
                      generated. If OFF is used, this option does nothing. If
                      AUTO is used and GTIDs are enabled on the server, 'SET
                      @@GLOBAL.GTID_PURGED' is added to the output. If GTIDs
                      are disabled, AUTO does nothing. If no value is supplied
                      then the default (AUTO) value will be considered.
  --single-transaction
                      Creates a consistent snapshot by dumping all tables in a
                      single transaction. Works ONLY for tables stored in
                      storage engines which support multiversioning (currently
                      only InnoDB does); the dump is NOT guaranteed to be
                      consistent for other storage engines. While a
                      --single-transaction dump is in process, to ensure a
                      valid dump file (correct table contents and binary log
                      position), no other connection should use the following
                      statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
                      TRUNCATE TABLE, as consistent snapshot is not isolated
                      from them. Option automatically turns off --lock-tables.
  --dump-date         Put a dump date to the end of the output.
                      (Defaults to on; use --skip-dump-date to disable.)
  --skip-opt          Disable --opt. Disables --add-drop-table, --add-locks,
                      --create-options, --quick, --extended-insert,
                      --lock-tables, --set-charset, and --disable-keys.
  -S, --socket=name   The socket file to use for connection.
  --secure-auth       Refuse client connecting to server if it uses old
                      (pre-4.1.1) protocol. Deprecated. Always TRUE
  --ssl-mode=name     SSL connection mode.
  --ssl               Deprecated. Use --ssl-mode instead.
                      (Defaults to on; use --skip-ssl to disable.)
  --ssl-verify-server-cert
                      Deprecated. Use --ssl-mode=VERIFY_IDENTITY instead.
  --ssl-ca=name       CA file in PEM format.
  --ssl-capath=name   CA directory.
  --ssl-cert=name     X509 cert in PEM format.
  --ssl-cipher=name   SSL cipher to use.
  --ssl-key=name      X509 key in PEM format.
  --ssl-crl=name      Certificate revocation list.
  --ssl-crlpath=name  Certificate revocation list path.
  --tls-version=name  TLS version to use, permitted values are: TLSv1, TLSv1.1
  -T, --tab=name      Create tab-separated textfile for each table to given
                      path. (Create .sql and .txt files.) NOTE: This only works
                      if mysqldump is run on the same machine as the mysqld
                      server.
  --tables            Overrides option --databases (-B).
  --triggers          Dump triggers for each dumped table.
                      (Defaults to on; use --skip-triggers to disable.)
  --tz-utc            SET TIME_ZONE='+00:00' at top of dump to allow dumping of
                      TIMESTAMP data when a server has data in different time
                      zones or data is being moved between servers with
                      different time zones.
                      (Defaults to on; use --skip-tz-utc to disable.)
  -u, --user=name     User for login if not current user.
  -v, --verbose       Print info about the various stages.
  -V, --version       Output version information and exit.
  -w, --where=name    Dump only selected records. Quotes are mandatory.
  -X, --xml           Dump a database as well formed XML.
  --plugin-dir=name   Directory for client-side plugins.
  --default-auth=name Default authentication client-side plugin to use.
  --enable-cleartext-plugin
                      Enable/disable the clear text authentication plugin.
mysqldump常用命令
## 备份所有的库
 mysqldump -u root -p --all-databases > backup_<date>_all.sql
## 备份指定的库
 mysqldump -u root --p <database_name> > backup_<date>_<database_name>.sql
## 备份多个库
 mysqldump -u root --p <database_name>,<database_name> > backup_<date>.sql
## 备份一个表
 mysqldump -u root --p <database_name> <table_name> > backup_<date>_<database_name>_<table_name>.sql
## 备份指定的数据
 mysqldump -u root --p <database_name> <table_name> --where "last_name='ORACLE' order by first_name > backup_<date>.sql

## 备份所有的库
 mysql -u root --p < backup.sql
## 还原指定的库
 mysql -u root --p <database_name> < backup_<dataabse_name>.sql
## 还原指定的库
 mysql  --user=<user> --password  <database_name> < backup_<dataabse_name>.sql 
B.通过SQL语句备份
## 导出employees表到/tmp/employees.txt文件
 select * into outfile '/tmp/employees.txt' from employees;
## 导入文件/tmp/employees.txt到employees表
 load data infile '/tmp/employees.txt' into table employees;
## 备份数据库
 backup database <database_name> to '<database_name>-backup.sql'
## 还原数据库
 restore from '<database_name>-backup.sql'
注意:必须要有FILE权限才能执行,她和mysqlhotcopy的工作原理差不多,都是锁表,然后拷贝数据文件。虽然可以实现在线备份,但效果不好,不推荐使用。它只拷贝表结构文件和数据文件,不同时拷贝索引文件,因此恢复时比较慢。
C.通过mysqlhotcopy备份
mysqlhotcopy是一个Perl程序,最初由Tim Bunce编写。她使用lock tables、flush tables和cp/scp来快速备份数据库。它是备份数据库或单个表的最快的途径,只能用于备份MyISAM。先将需要备份的数据库加上一个读锁,然后用FLUSH TABLES将内存中的数据写回到硬盘上的数据库,最后,把需要备份的数据库文件复制到目标目录。mysqlhotcopy并非mysql自带,需要安装Perl的数据库接口包;下载地址为:http://dev.mysql.com/downloads/dbi.html
## 备份一个数据库
 mysqlhotcopy <database_name> /backups
## 备份多个库
 mysqlhotcopy <database_name> accounts /backups
## 备份一个库到另外一台服务器
 mysqlhotcopy --method=scp <database_name>  username@backup-server:/backup
## 备份以employees开头的表
 mysqlhotcopy <database_name>./^employees/ /backup 
D.备份数据文件方式
备份数据文件是最直接、快速、方便,但是不能实现增量备份。为了保证数据的一致性,备份前需执行以下SQL语句:
flush tables with read lock;
flush tables <tbl_list> with read lock;
即把内存中的数据都写到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入,这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可,备份Innodb表时,还需要备份其日志文件,即ib_logfile* 文件,结束后要unlock tables。

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql>
E.二进制日志(binlog)
采用binlog(Oracle redo类似)的方法相对来说更灵活,省心省力,而且还可以支持增量备份。启用binlog时必须要重启mysqld,5.7.3以后版本必须配置server-id,文件名可配置绝对路径,即可开启binlog
my》cnf增加以下内容即可开启binlog
server-id=1
log-bin=ohs-binlog
log-bin-index=ohs-binlog.index
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
mysql>
[root@mysql mysql]# ls -l ohs-binlog.*
-rw-r-----. 1 mysql mysql 154 Nov 15 13:49 ohs-binlog.000001
-rw-r-----. 1 mysql mysql  20 Nov 15 13:49 ohs-binlog.index 

binlog的文件和切换

ohs-binlog.000001文件是mysqld记录所有对数据的更新操作
ohs-binlog.index 文件是所有binlog的索引
[root@mysql mysql]#
进行二进制日志的切换,默认情况下当二进制日志写满了或者数据库重启了才会进行切换,但是也可以通过下面的命令手工的进行切换
mysql> flush logs;
binlog模式下的备份和回复
备份出来的binlog文件可以用MySQL提供的工具mysqlbinlog 来查看 ## 把binlog文件转换为sql文件
 mysqlbinlog mysql-bin.010310 > mysql-bin.010310.sql
## 指定日期
 mysqlbinlog --stop-datetime='201204-29 17:00:00' mysql-bin.010312 > mysql-bin.010312.sql
## 其他可用选项
 --stop-datetime
 --start-datatime
 --start-position
 --stop-position  
恢复时,可以使用类似以下语句来做到: mysql --user=root -password < mysql-bin.010310.sql
 mysqlbinlog ohs-binlog.000001 | mysql -uroot -pOracle12. <ohs>
F.mysqlpump
MySQL5.7之后多了一个备份工具:mysqlpump。mysqlpump和mysqldump一样,属于逻辑备份,备份以SQL形式的文本保存。mysqlpump相对于之前的逻辑备份工具mysqldump来说有如下优势:
支持基于表的并行导出功能(参数–default-parallelism,默认为2)
导出的时候带有进度条(参数–watch-progress,默认是开启的)
支持直接压缩导出导入(参数–compress-output,支持ZLIB和LZ4) 注意:mysqlpump的语法与mysqldump兼容,支持基于库和表的并行导出,对比mysqldump速度提升非常明显 


Reference
https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html
https://dev.mysql.com/doc/refman/5.7/en/backup-methods.html

http://dev.mysql.com/doc/internals/en/binlog-file.html



关键词:mysql 

相关文章

OGG from MySQL to Oracle
MySQL数据库高可用实践
Install oracle products on docker
MySQL Cookbook for Oracle DBA
MySQL HA - Innodb Cluster
腾讯微信的PhxSQL数据库
MySQL Group Replication(MGR)
MySQL and Oracle Enterprise Manager
MySQL Tools for performance, backup, monitor
MySQL Multi-Master Single-Slave Replication
MySQL and GPL
MySQL monthly report from alibaba
Top