备份导出

只导出数据结构(表结构),不导出数据: mysqldump --opt -d --column-statistics=0 -h localhost -P 3306 -u root -p [database] [table] > database.sql

即导出数据结构(表结构),又导出数据: mysqldump --opt -h localhost -P 3306 -u root -p [database] [table] > database.sql

常见过错

  • 低版本的mysql备份时会呈现如下过错,需要在指令行中添加参数 --column-statistics=0

    mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'database' AND TABLE_NAME = 'table';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109)

参数注解

-h, --host=name #主机名
-P[ port_num], --port=port_num #用于衔接MySQL服务器的的TCP/IP端口号
--master-data #这个选项能够把binlog的方位和文件名添加到输出中,假如等于1,将会打印成一个CHANGE MASTER指令;假如等于2,会加上注释前缀。而且这个选项会主动翻开--lock-all-tables,除非一起设置了--single-transaction(这种情况下,大局读锁只会在开始dump的时候加上一小段时刻,不要忘了阅览--single-transaction的部分)。在任何情况下,一切日志中的操作都会发生在导出的准确时刻。这个选项会主动封闭--lock-tables。
-x, --lock-all-tables #确定一切库中一切的表。这是经过在整个dump的过程中持有大局读锁来实现的。会主动封闭--single-transaction--lock-tables--single-transaction #经过将导出操作封装在一个业务内来使得导出的数据是一个共同性快照。只有当表运用支持MVCC的存储引擎(目前只有InnoDB)时才能够工作;其他引擎不能确保导出是共同的。当导出敞开了--single-transaction选项时,要确保导出文件有效(正确的表数据和二进制日志方位),就要确保没有其他衔接会执行如下句子:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,这会导致共同性快照失效。这个选项敞开后会主动封闭--lock-tables。
-l, --lock-tables #对一切表加读锁。(默许是翻开的,用--skip-lock-tables来封闭,上面的选项会把封闭-l选项)
-F, --flush-logs #在开始导出前改写服务器的日志文件。留意,假如你一次性导出许多数据库(运用 -databases=或--all-databases选项),导出每个库时都会触发日志改写。破例是当运用了--lock-all-tables--master-data时:日志只会被改写一次,那个时候一切表都会被锁住。所以假如你希望你的导出和日志改写发生在同一个确定的时刻,你需要运用--lock-all-tables,或许--master-data合作--flush-logs--delete-master-logs #备份完成后删去主库上的日志。这个选项会主动翻开``--master-data`。
--opt #同-add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys。(默许已敞开,--skip-opt封闭标明这些选项保持它的默许值)应该给你为读入一个MySQL服务器的尽可能最快的导出,--compact差不多是禁用上面的选项。
-q, --quick #不缓冲查询,直接导出至stdout。(默许翻开,用--skip-quick来封闭)该选项用于转储大的表。
--set-charset #将SET NAMES default_character_set加到输出中。该选项默许启用。要想禁用SET NAMES句子,运用--skip-set-charset--add-drop-tables #在每个CREATE TABLE句子前添加DROP TABLE句子。默许敞开。
--add-locks #在每个表导出之前增加LOCK TABLES而且之后UNLOCK TABLE。(为了使得更快地刺进到MySQL)。默许敞开。
--create-option #在CREATE TABLE句子中包括一切MySQL表选项。默许敞开,运用--skip-create-options来封闭。
-e, --extended-insert #运用全新多行INSERT语法,默许敞开(给出更紧缩而且更快的刺进句子)
-d, --no-data #不写入表的任何行信息。假如你只想得到一个表的结构的导出,这是很有用的。
--add-drop-database #在create数据库之前先DROP DATABASE,默许封闭,所以一般在导入时需要确保数据库已存在。
--default-character-set= #运用的默许字符集。假如没有指定,mysqldump运用utf8。
-B, --databases #转储几个数据库。通常情况,mysqldump将指令行中的第1个姓名参量看作数据库名,后边的名看作表名。运用该选项,它将一切姓名参量看作数据库名。CREATE DATABASE IF NOT EXISTS db_name和USE db_name句子包含在每个新数据库前的输出中。
--tables #覆盖--database选项。选项后边的一切参量被看作表名。
-u[ name], --user= #衔接服务器时运用的MySQL用户名。
-p[password], --password[=password] #衔接服务器时运用的暗码。假如你运用短选项形式(-p),不能在选项和暗码之间有一个空格。假如在指令行中,疏忽了--password或-p选项后边的 暗码值,将提示你输入一个。

导入

source 指令导入

source database.sql

mysql 指令导入

mysql -u userName -p passwd -h host -P port database_name < database.sql

运用 LOAD DATA 导入数据

MySQL 中供给了LOAD DATA INFILE句子来刺进数据。 以下实例中将从当前目录中读取文件 database.sql ,将该文件中的数据刺进到当前数据库的 mytbl 表中。

mysql> LOAD DATA LOCAL INFILE 'database.sql' INTO TABLE mytbl;

假如指定LOCAL关键词,则标明从客户主机上按途径读取文件。假如没有指定,则文件在服务器上按途径读取文件。

你能明确地在LOAD DATA句子中指出列值的分隔符和行尾符号,可是默许符号是定位符和换行符。

两个指令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,可是假如两个一起被指定,FIELDS 子句有必要呈现在 LINES 子句之前。

假如用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户有必要至少指定它们中的一个。

mysql> LOAD DATA LOCAL INFILE 'database.sql' INTO TABLE mytbl
  -> FIELDS TERMINATED BY ':'
  -> LINES TERMINATED BY '\r\n';

LOAD DATA 默许情况下是按照数据文件中列的次序刺进数据的,假如数据文件中的列与刺进表中的列不共同,则需要指定列的次序。

如,在数据文件中的列次序是 a,b,c,但在刺进表的列次序为b,c,a,则数据导入语法如下:

mysql> LOAD DATA LOCAL INFILE 'database.sql'
    -> INTO TABLE mytbl (b, c, a);

运用 mysqlimport 导入数据

mysqlimport 客户端供给了 LOAD DATA INFILEQL 句子的一个指令行接口。mysqlimport 的大多数选项直接对应 LOAD DATA INFILE 子句。

从文件 database.sql 中将数据导入到 mytbl 数据表中, 能够运用以下指令:

$ mysqlimport -u root -p --local mytbl database.sql
password *****

mysqlimport 指令能够指定选项来设置指定格局,指令句子格局如下:

$ mysqlimport -u root -p --local --fields-terminated-by=":" \
   --lines-terminated-by="\r\n"  mytbl database.sql
password *****

mysqlimport 句子中运用 –columns 选项来设置列的次序:

$ mysqlimport -u root -p --local --columns=b,c,a \
    mytbl database.sql
password *****

导出时直接导入其他数据库

mysqldump -u root -p database_name \
       | mysql -h other-host.com database_name

参考链接

MySQL备份指令mysqldump参数阐明与示例

MySQL 导出数据

MySQL 导入数据

作者:草帽豆子
原文链接:/post/698134…