我想将热表的内容复制到同一数据库中的另一个表。我不想重命名原件或将其删除。
一个选项是创建一个新表LIKE当前的表然后INSERT INTO ... SELECT。
但是,我认为使用mysqlhotcopy创建表的备份可能是最快的,然后将其加载到第二个表中。我不确定如何完成第二部分 - 从备份加载到任意表Foo。我想用PHP做到这一点。
有什么想法吗?
答案 0 :(得分:2)
这是概述:
你的答案实际上取决于你的桌子有多大以及你可以忍受的锁定时间。可以在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;
一个真实的例子:
对于333,935个体面大小的记录,8.68秒。
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
考虑做类似的事情,但是在具有正确隔离级别的事务中。
<强>热拷贝强>
如果您是从PHP执行此操作,那么通过正常的MySQL身份验证机制进行此操作会很好。否则,您需要直接访问数据目录,并在mysql文件上具有读取权限。这可能会打开您可能不想与之抗争的其他安全问题。
答案 1 :(得分:2)
我会使用SELECT...INTO OUTFILE
和LOAD DATA INFILE
来完成此任务。
你有很大的灵活性,而且表现得更快。
答案 2 :(得分:1)
我打算建议使用php myadmin并单击“操作”选项卡。那里有一个表格复制程序。如果这将是一个持续的事情,创建一个新表并插入内容应该这样做。