我打算将批量的insert 改为load data infile.
但是有个疑问,从数据库会不会无法同步 load data infile的数据?
还有,设置的基于insert语句的触发器,改为load data infile 后,能否还被触发?

解决方案 »

  1.   

    但是有个疑问,从数据库会不会无法同步 load data infile的数据? 
    ---------------------
    会照样同步的,只要你打开了二进制日志功能的话
    还有,设置的基于insert语句的触发器,改为load data infile 后,能否还被触发?
    ------------------------------------------
    同样会触发的
      

  2.   

    mysql> create table tb_tr1(id int,total int);
    Query OK, 0 rows affected (0.06 sec)mysql> create table tb_tr_log (id int, total int, input_time datetime);
    Query OK, 0 rows affected (0.06 sec)mysql> delimiter //
    mysql> create trigger tr_tr1 before insert on tb_tr1 for each row
        -> begin
        -> insert into tb_tr_log values(new.id,new.total,now());
        -> end;
        -> //
    Query OK, 0 rows affected (0.05 sec)mysql> delimiter ;mysql> load data infile 'e:\\aaa.txt' into table tb_tr1 fields terminated by ','
     lines terminated by '\r\n';
    Query OK, 3 rows affected (0.05 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0mysql> select * from tb_tr_log;
    +------+-------+---------------------+
    | id   | total | input_time          |
    +------+-------+---------------------+
    |    1 |   200 | 2009-10-29 17:22:55 |
    |   10 |  1000 | 2009-10-29 17:22:55 |
    |   29 |   800 | 2009-10-29 17:22:55 |
    +------+-------+---------------------+
    3 rows in set (0.00 sec)mysql>
      

  3.   

    mysql> select * from tb_tr1;
    +------+-------+
    | id   | total |
    +------+-------+
    |    1 |   200 |
    |   10 |  1000 |
    |   29 |   800 |
    +------+-------+
    3 rows in set (0.00 sec)mysql>
      

  4.   

    However, all other functions are replicated correctly using statement-based replication, including RAND(), NOW(), LOAD DATA INFILE, and so forth. --slave-load-tmpdir
    The name of the directory where the slave creates temporary files for replicating LOAD DATA INFILE statements. 如果从服务器正复制LOAD DATA INFILE语句,你应也备份该目录内从服务器用于该目的的任何SQL_LOAD-*文件。从服务器需要这些文件继续复制任何中断的LOAD DATA INFILE操作。用--slave-load-tmpdir选项来指定目录的位置。如果未指定, 默认值为tmpdir变量的值。 --slave-load-tmpdir=file_name从服务器创建临时文件的目录名。该选项默认等于tmpdir系统变量的值。当从服务器SQL线程复制LOAD DATA INFILE语句时,从中继日志将待装载的文件提取到临时文件,然后将这些文件装入到表中。如果装载到主服务器上的文件很大,从服务器上的临时文件也很大。因此,建议使用该选项告诉从服务器将临时文件放到文件系统中有大量可用空间的目录下。在这种情况下,也可以使用--relay-log选项将中继日志放到该文件系统中,因为中继日志也很大。--slave-load-tmpdir应指向基于硬盘的文件系统,而非基于内存的文件系统:从服务器需要用临时文件在机器重启时用于复制LOAD DATA INFILE。系统启动过程中操作系统也不能清除该目录。
      

  5.   

    版主所说SQL_LOAD-*指的是什么?
    如果我的语句是 load data infile 'e:\\aaa.txt' into table tb_tr1 fields terminated by ','
     lines terminated by '\r\n';那SQL_LOAD-* 指的就是e:\\aaa.txt?
      

  6.   

    你可以做个试验看一下。当然的主DB做完load data 后,这个文件,同步时也应该被创建到从DB的这个目录中。
      

  7.   

    1#load data是记binlog的
    2#同步只须binlog