作者:孟新
资料来源:https://www.cnblogs.com/mengxinJ/p/14387096.html
Mysql dump-h $ host-P $ port-u $ user-add-locks=0-no-create-info-single-transaction-set-gtid-purged=OFF d B1-where=' a900 '-result-file=/client _ tmp/t . SQL将数据导出为SQL文件并保存。上述参数的含义是:
1.——single-transaction的作用是在导出数据时,使用一致快照启动事务的方法,而不是给表db1.t添加表锁;
2.-add-locks设置为0,这意味着“锁表不写”不会添加到输出文件结果中。
3.No-No-create-info表示不需要导出表结构;
4.Set-GTID-Purged=off表示不输出与GTID相关的信息;
5.-result-file指定输出文件的路径,其中client表示生成的文件位于客户端计算机上。
MySQL-h 127 . 0 . 0 . 1-p 13000-u root DB2-e ' source/client _ tmp/t . SQL ' source不是SQL语句,而是客户端命令。也就是说,服务器端专门执行文件中的sql语句,所以binlog 记录的都是具体的 sql。
2.保存数据的默认方式是多记录对,如以下格式所示
如果您只想为一条语句保存一条记录,可以添加参数skip-skip-extended-insert。
select * from db1 . t where a900 into outfile '/server _ tmp/t . CSV ';
1,into outfile指定文件生成位置(/server_tmp/),该位置必须受参数secure_file_priv的限制。
参数secure_file_priv的可选值和功能如下:
1)如果设置为空,说明文件生成的位置不受限制,这是一个不安全的设置;
2)如果设置为表示路径的字符串,则要求生成的文件只能放在这个指定的目录或其子目录下;
3)如果设置为NULL,则意味着在这个MySQL实例上禁止select … into outfile操作。
2.如果同一目录中存在同名文件,将会报告错误。
3.一般来说,一条记录对应于CSV文件中的一行,但如果字段值中有'换行,制表符',它也将包含在文件中,并且' \ '将用于对其进行转义。
将file '/server_tmp/t.csv '中的数据加载到表db2.t中;流程:
1.打开文件/server_tmp/t.csv,使用tab (\t)作为字段间的分隔符,使用newline (\n)作为记录间的分隔符,读取数据;
2.开始交易。
3.确定每行中的字段数是否与表db2.t中的字段数相同:
1)如果不同,则直接报错并回滚交易;
2)如果相同,构造一行,调用InnoDB引擎接口,写入表中。
4.重复步骤3,直到读入/server_tmp/t.csv的整个文件并提交事务。
2.binlog的记录,过程如下:
1)主库执行完成后,将/server_tmp/t.csv文件的内容直接写入binlog文件。
2)将语句LOAD DATA LOCAL INFILE '/TMP/SQL _ LOAD _ m b-1-0 '写入表` DB2 `. t `并写入binlog文件。
3)将此binlog日志发送到备份库。
4)当备份库的应用线程执行该事务日志时:
A.第一
binlog 中 t.csv 文件的内容读出来,写入到本地临时目录 /tmp/SQL_LOAD_MB-1-0 中;b. 再执行 load data 语句,往备库的 db2.t 表中插入跟主库相同的数据。
关于 "local":
1)不加“local”,是读取服务端的文件,这个文件必须在 secure_file_priv 指定的目录或子目录下;
2)加上“local”,读取的是客户端的文件,只要 mysql 客户端有访问这个文件的权限即可。这时候,MySQL 客户端会先把本地文件传给服务端(其他会话涉及的操作),然后执行上述的 load data 流程。
3、上面的导出操作并不会导出表结构,所以,如果向导出表结构,可以使用 mysqldump 来同时导出 CSV 和表结构
mysqldump -h$host -P$port -u$user --single-transaction --set-gtid-purged=OFF db1 t --where="a>900" --tab=$secure_file_priv会在$secure_file_priv 定义的目录下,创建一个 t.sql 文件保存建表语句,同时创建一个 t.txt 文件保存 CSV 数据。
1、执行 create table r like t,创建一个相同表结构的空表;
2、执行 alter table r discard tablespace,这时候 r.ibd 文件会被删除;
3、执行 flush table t for export,这时候 db1 目录下会生成一个 t.cfg 文件;
4、在 db1 目录下执行 cp t.cfg r.cfg; cp t.ibd r.ibd;这两个命令(这里需要注意的是,拷贝得到的两个文件,MySQL 进程要有读写权限);
5、执行 unlock tables,这时候 t.cfg 文件会被删除;
6、执行 alter table r import tablespace,将这个 r.ibd 文件作为表 r 的新的表空间,由于这个文件的数据内容和 t.ibd 是相同的,所以表 r 中就有了和表 t 相同的数据。
2、在执行 import tablespace 的时候,为了让文件里的表空间 id 和数据字典中的一致,会修改 r.ibd 的表空间 id。而这个表空间 id 存在于每一个数据页中。因此,如果是一个很大的文件(比如 TB 级别),每个数据页都需要修改,所以你会看到这个 import 语句的执行是需要一些时间的。当然,如果是相比于逻辑导入的方法,import 语句的耗时是非常短的。
2、需要到服务器上拷贝数据,在用户无法登录数据库主机的场景下无法使用
3、由于是通过拷贝物理文件实现的,源表和目标表都是使用 InnoDB 引擎时才能使用
2、前两个可以条件拷贝,最后一个不行
3、第二个功能是最灵活的,但是在集群从库接收时会比较耗时(需要先拷贝 CSV 文件数据到本地临时文件),最后一个执行效率是最高的,但是不能跨引擎,且只能进行全量拷贝。
作者:萌新J
出处:https://www.cnblogs.com/mengxinJ/p/14387096.html