2. into outfile指定了文件的生成位置(/server_tmp/),这个位置必须受参数secure_file_priv的
限制。参数secure_file_priv的可选值和作用分别是:
如果设置为empty,表示不限制文件生成的位置,这是不安全的设置;
如果设置为一个表示路径的字符串,就要求生成的文件只能放在这个指定的目录,或者
它的子目录;
如果设置为NULL,就表示禁止在这个MySQL实例上执行select … into outfile 操作。
3. 这条命令不会帮你覆盖文件,因此你需要确保/server_tmp/t.csv这个文件不存在,否则执行
语句时就会因为有同名文件的存在而报错。
4. 这条命令生成的文本文件中,原则上一个数据行对应文本文件的一行。但是,如果字段中包
含换行符,在生成的文本中也会有换行符。不过类似换行符、制表符这类符号,前面都会跟
上“\”这个转义符,这样就可以跟字段之间、数据行之间的分隔符区分开。
得到.csv导出文件后,你就可以用下面的load data命令将数据导入到目标表db2.t中。
这条语句的执行流程如下所示。
1. 打开文件/server_tmp/t.csv,以制表符(\t)作为字段间的分隔符,以换行符(\n)作为记录之
间的分隔符,进行数据读取;
2. 启动事务。
3. 判断每一行的字段数与表db2.t是否相同:
若不相同,则直接报错,事务回滚;
若相同,则构造成一行,调用InnoDB引擎接口,写入到表中。
4. 重复步骤3,直到/server_tmp/t.csv整个文件读入完成,提交事务。
你可能有一个疑问,如果如果binlog_format=statementbinlog_format=statement,这个,这个loadload语句记录到语句记录到binlogbinlog里以后,里以后,
怎么在备库重放呢?怎么在备库重放呢?
由于/server_tmp/t.csv文件只保存在主库所在的主机上,如果只是把这条语句原文写到binlog中,
在备库执行的时候,备库的本地机器上没有这个文件,就会导致主备同步停止。
所以,这条语句执行的完整流程,其实是下面这样的。
1. 主库执行完成后,将/server_tmp/t.csv文件的内容直接写到binlog文件中。