MySQL数据的导入与导出
本文针对window操作系统与mysql8.0的版本。
1.mysql导出sql文件
这里直接使用mysql提供的mysqlpump工具,以下是mysqlpump说明
mysqlpump客户实用程序执行逻辑备份,产生一组能够被执行以再现原始数据库对象定义和表数据的sql语句。它转储一个或多个mysql数据库以备份或传输到另一个sql服务器。
mysqlpump功能包括:
-
并行处理数据库和数据库中的对象,以加速转储过程
-
更好地控制要转储的数据库和数据库对象(表,存储程序,用户帐户)
-
将用户帐户转储为帐户管理语句(
create user
,grant
)而不是作为插入mysql
系统数据库 -
创建压缩输出的能力
-
进度指标(值是估计值)
-
对于转储文件重新加载,
innodb
通过在插入行之后添加索引来为表 创建更快的二级索引
至少需要select
转储表的特权,show view
转储视图,trigger
转储触发器以及未使用lock tables
该 选项的 特权。转储用户定义需要系统数据库的select
权限mysql
。某些选项可能需要其他权限,如选项说明中所述。
(1)单个数据库导出
语法:mysqlpump -h [ip] -p [port] -u [user_name] -p[password] db_name [tbl_name1 tbl_name2 ...] > file_path
(2)多个数据库导出
语法:mysqlpump -h [ip] -p [port] -u [user_name] -p[password] --databases db_name1 db_name2 ... > file_path
mysqlpump功能很强大还支持多种选项,具体选项可以查看官方文档
(3)将数据从一个mysql服务器复制到另一个mysql服务器
语法:mysqldump -h [ip] -p [port] -u [user_name] -p[password] --opt db_name | mysql -h [ip] -p [port] -u [user_name] -p[password] --compress db_name
--opt:默认情况下启用此选项 。它提供快速转储操作并生成转储文件,可以快速重新加载到mysql服务器。 是组合的简写。
--compress:压缩客户端和服务器之间发送的所有信息(如果可能)。从mysql 8.0.18开始,不推荐使用此选项。它将在未来的mysql版本中删除。
2.mysql执行sql文件
进入mysql客户端执行:source file_path 或 \. file_path命令。
3.mysql导入批量数据
load data完整语法:
low_priority:如果使用low_priority
修饰符,则load data
语句的执行将延迟,直到没有其他客户端从表中读取。这会影响只使用表级锁只存储引擎(例如myisam
, memory
和merge
)。
concurrent:如果使用满足并发插入条件concurrent
的myisam
表指定修饰符 (即,它在中间不包含空闲块),则其他线程可以在load data
执行时从表中检索数据 。load data
即使没有其他线程同时使用该表,此修饰符也会影响位的性能。
local:如果local
指定,则文件由客户端主机上的客户端程序读取并发送到服务器。该文件可以作为完整路径名提供,以指定其确切位置。如果以相对路径名的形式给出,则相对于启动客户端程序的目录解释名称。
如果local
未指定,则文件必须位于服务器主机上,并由服务器直接读取。非local
加载操作读取位于服务器上的文本文件。出于安全原因,此类操作要求您拥有该file
权限。此外,非local
加载操作受 系统变量设置的限制。如果变量值是非空目录名,则要加载的文件必须位于该目录中。如果变量值为空(这是不安全的),则文件只需要服务器可读。
file_name:文件路径,在windows上,将路径名中的反斜杠指定为正斜杠或加倍反斜杠。
在replace
与ignore
输入行的修饰处理控制复制唯一键值的现有行:
-
如果指定
replace
,则输入行将替换现有行。换句话说,主键或唯一索引的值与现有行的值相同。 -
如果指定
ignore
,则会丢弃复制唯一键值上现有行的行。 -
如果未指定任何修饰符,则行为取决于是否
local
指定了修饰符。如果没有local
,则在找到重复键值时会发生错误,并忽略文本文件的其余部分。使用时local
,默认行为与ignore
指定的相同; 这是因为服务器无法在操作过程中停止传输文件。
partition:
load data
支持显式分区选择,使用partition
带有一个或多个以逗号分隔的分区,子分区或两者的名称列表的选项。使用此选项时,如果文件中的任何行无法插入列表中指定的任何分区或子分区,则语句将失败,并显示错误“ 找到与给定分区集不匹配的行”。有关更多信息和示例。对于使用使用表锁的存储引擎的分区表,例如myisam
, load data
无法修剪任何分区锁。这不适用于使用采用行级锁定的存储引擎的表,例如 innodb
。
character set:服务器使用系统变量指示的字符集 来解释文件中的信息。 set names
并且设置 不影响输入的解释。如果输入文件的内容使用的字符集与默认值不同,通常最好使用该character set
子句指定文件的字符集。
fields:如果指定fields
子句,则每个子句(terminated by
, [optionally] enclosed by
和 escaped by
)也是可选的,但必须至少指定其中一个子句。允许这些子句的参数仅包含ascii字符。
terminated by:字段与字段之间的分隔符。
enclosed by:包裹字段的字符,仅用于从具有字符串数据类型。
escaped by:控制如何读取或写入特殊字符,即描述的转义字符。
lines:
starting by:如果所有输入行都有一个您想要忽略的公共前缀,则可以使用跳过前缀和前面的任何内容。如果一行不包含前缀,则跳过整行。
terminated by:每行与每行之间的分隔符。
ignore number:
该选项可用于忽略文件开头的行.
col_name_or_user_var:默认情况下,如果在
load data
语句末尾没有提供列列表 ,则输入行应包含每个表列的字段。如果只想加载某些表的列,请指定列列表。
set
子句:每个col_name_or_user_var
值都是列名或用户变量。使用用户变量,该set
子句使您可以在将结果分配给列之前对其值执行预处理转换。
4.mysql导出批量数据
语法:select [col_name [,col_name] ...] into outfile 'file_path' [character set charset_name]
[{fields | columns}
[terminated by 'string']
[[optionally] enclosed by 'char']
[escaped by 'char']
]
[lines
[starting by 'string']
[terminated by 'string']
]
from table_name;
该select ... into outfile
语句主要用于让您快速将表转储到服务器计算机上的文本文件中。如果要在服务器主机之外的其他主机上创建生成的文件,通常无法使用, select ... into outfile
因为无法相对于服务器主机的文件系统写入文件的路径。
但是,如果mysql客户端软件安装在远程计算机上,则可以使用客户端命令(例如 在客户端主机上生成文件)。 mysql -e "select ..." >
file_name
如果可以使用服务器文件系统上的网络映射路径访问远程主机上文件的位置,则还可以在服务器主机以外的其他主机上创建生成的文件。在这种情况下,目标主机上不需要存在 mysql(或其他一些mysql客户端程序)。
select ... into outfile
是补充load data
。列值将写入转换为character set
子句中指定的字符集。如果不存在此类子句,则使用binary
字符集转储值。实际上,没有字符集转换。如果结果集包含多个字符集中的列,则输出数据文件也将如此,您可能无法正确重新加载文件。