2009-06-24 40 views
1

我想将热表的内容复制到同一数据库上的另一个表。我不想重命名原件或将其删除。使用备份复制MySQL表

一个选项是创建一个新表,如同当前的一个,然后INSERT INTO ... SELECT。

但是,我认为使用mysqlhotcopy创建我的表的备份可能是最快的,然后将其加载到第二个表中。我不知道我该如何完成第二部分 - 从备份加载到任意表Foo中。我想用PHP来做到这一点。

任何想法?

回答

2

这是一个概述:

你的答案真的取决于你能有多大你的表是和读了多少,锁定时间站立。 A 批号的记录可以在2秒内复制。

不管你用哪种方式切割它,你在阅读时都需要在表上进行某种读取锁定(无论如何都要获得一致的读取)。 InnoDB事务可能提供一种获得一致快照而不阻碍其他编写者的方式。 MyISAM或InnoDB将有非常不同的备份策略。

于MyISAM

一个非常快速的方式做你指的是什么:

CREATE TABLE x_backup LIKE x; 
ALTER TABLE x_backup DISABLE KEYS; 
INSERT INTO x_backup SELECT * from x; 
ALTER TABLE x_backup ENABLE KEYS; 

一个真实的例子:

8.68秒为333935个体面大小的记录。

  Name: sds_profile 
     Engine: MyISAM 
     Version: 10 
    Row_format: Dynamic 
      Rows: 333935 
Avg_row_length: 129 
    Data_length: 43114720 
    Index_length: 11572224 


mysql> create table x LIKE sds_profile; 
Query OK, 0 rows affected (0.01 sec) 

mysql> alter table x disable keys; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into x select * from sds_profile; 
Query OK, 333935 rows affected (8.68 sec) 
Records: 333935 Duplicates: 0 Warnings: 0 

mysql> alter table x enable keys; 
Query OK, 0 rows affected (0.78 sec) 

随着InnoDB的

考虑做类似,但与正确的隔离级别的事务。

hotcopy但

如果是从PHP这样做,这将有利于通过正常的MySQL认证机制来做到这一点。否则,您需要直接访问数据目录,并在mysql文件中读取权限。这可能会引发更多的安全问题,您可能不想与之抗衡。

1

我打算建议使用php myadmin并单击操作选项卡。那里有一个表格复制程序。如果这将是一个持续的事情,创建一个新表格并插入内容应该这样做。