各种备份方式的优劣
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