How can I transfer data between 2 MySQL databases?

前端 未结 5 1958
误落风尘
误落风尘 2020-12-14 08:08

I want to do that using a code and not using a tool like \"MySQL Migration Toolkit\". The easiest way I know is to open a connection (using MySQL connectors) to DB1 and read

相关标签:
5条回答
  • 2020-12-14 08:20

    First I'm going to assume you aren't in a position to just copy the data/ directory, because if you are then using your existing snapshot/backup/restore will probably suffice (and test your backup/restore procedures into the bargain).

    In which case, if the two tables have the same structure generally the quickest, and ironically the easiest approach will be to use SELECT...INTO OUTFILE... on one end, and LOAD DATA INFILE... on the other.

    See http://dev.mysql.com/doc/refman/5.1/en/load-data.html and .../select.html for definitive details.

    For trivial tables the following will work:

    SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
      FIELDS TERMINATED BY ',' 
      OPTIONALLY ENCLOSED BY '"' 
      ESCAPED BY '\\\\' 
      LINES TERMINATED BY '\\n' ;
    
    LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
      FIELDS TERMINATED BY ',' 
      OPTIONALLY ENCLOSED BY '"' 
      ESCAPED BY '\\\\' 
      LINES TERMINATED BY '\\n' ;
    

    We have also used FIFO's to great effect to avoid the overhead of actually writing to disk, or if we do need to write to disk for some reason, to pipe it through gzip.

    ie.

    mkfifo /tmp/myfifo
    gzip -c /tmp/myfifo > /tmp/mytable.csv.gz &
    ... SEL
    
    ECT... INTO OUTFILE '/tmp/myfifo' .....
    wait
    
    gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo &
    ... LOAD DATA INFILE /tmp/myfifo .....
    wait
    

    Basically, one you direct the table data to a FIFO you can compress it, munge it, or tunnel it across a network to your hearts content.

    0 讨论(0)
  • 2020-12-14 08:20

    The FEDERATED storage engine? Not the fastest one in the bunch, but for one time, incidental, or small amounts of data it'll do. That is assuming you're talking about 2 SERVERS. With 2 databases on one and the same server it'll simply be:

    INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;
    
    0 讨论(0)
  • 2020-12-14 08:21

    from http://dev.mysql.com/doc/refman/5.0/en/rename-table.html:

    As long as two databases are on the same file system, you can use RENAME TABLE to move a table from one database to another:

    RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
    
    0 讨论(0)
  • 2020-12-14 08:35

    You can use mysqldump and mysql (the command line client). These are command line tools and in the question you write you don't want to use them, but still using them (even by running them from your code) is the easiest way; mysqldump solves a lot of problems.

    You can make selects from one database and insert to the other, which is pretty easy. But if you need also to transfer the database schema (create tables etc.), it gets little bit more complicated, which is the reason I recommend mysqldump. But lot of PHP-MySQL-admin tools also does this, so you can use them or look at their code.

    Or maybe you can use MySQL replication.

    0 讨论(0)
  • 2020-12-14 08:42

    If you enabled binary logging on your current server (and have all the bin logs) you can setup replication for the second server

    0 讨论(0)
提交回复
热议问题