各种备份方式的优劣
| 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 | 是指在数据库关闭后才开始备份 |
--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>.sqlB.通过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/ /backupD.备份数据文件方式
备份数据文件是最直接、快速、方便,但是不能实现增量备份。为了保证数据的一致性,备份前需执行以下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.mysqlpumpMySQL5.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
