MySQL efficiently copy all records from one table to another

前端 未结 4 1412
栀梦
栀梦 2021-01-01 15:47

Is there a more-efficent, less laborious way of copying all records from one table to another that doing this:

INSERT INTO product_backup SELECT * FROM produ         


        
相关标签:
4条回答
  • 2021-01-01 15:58

    I don't think this will be worthy for a 50k table but: If you have the database dump you can reload a table from it. As you want to load a table in another one you could change the table name in the dump with a sed command: Here you have some hints: http://blog.tsheets.com/2008/tips-tricks/mysql-restoring-a-single-table-from-a-huge-mysqldump-file.html

    An alternative (depending on your design) would be to use triggers on the original table inserts so that the duplicated table gets the data as well.

    And a better alternative would be to create another MySQL instance and either run it in a master-slave configuration or in a daily dump master/load slave fashion.

    0 讨论(0)
  • 2021-01-01 16:05

    DROP the destination table:

    DROP TABLE DESTINATION_TABLE;
    CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);
    
    0 讨论(0)
  • 2021-01-01 16:11

    There's just one thing you're missing. Especially, if you're using InnoDB, is you want to explicitly add an ORDER BY clause in your SELECT statement to ensure you're inserting rows in primary key (clustered index) order:

    INSERT INTO product_backup SELECT * FROM product ORDER BY product_id
    

    Consider removing secondary indexes on the backup table if they're not needed. This will also save some load on the server.

    Finally, if you are using InnoDB, reduce the number of row locks that are required and just explicitly lock both tables:

    LOCK TABLES product_backup WRITE;
    LOCK TABLES product READ;
    INSERT INTO product_backup SELECT * FROM product ORDER BY product_id;
    UNLOCK TABLES;
    

    The locking stuff probably won't make a huge difference, as row locking is very fast (though not as fast as table locks), but since you asked.

    0 讨论(0)
  • 2021-01-01 16:22
    mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql
    

    This will take a dump of specified tables with a drop option to delete the exisiting table when you import it. then do,

    mysql db_name < filepath/file_name.sql
    
    0 讨论(0)
提交回复
热议问题