Скопируйте таблицу MySQL, используя резервную копию - PullRequest
1 голос
/ 24 июня 2009

Я хочу скопировать содержимое горячей таблицы в другую таблицу в той же базе данных. Я не хочу переименовывать оригинал или удалять его.

Один из вариантов - создать новую таблицу, КАК текущую, а затем INSERT INTO ... SELECT.

Тем не менее, я думаю, что было бы быстрее создать резервную копию моей таблицы, используя mysqlhotcopy, а затем загрузить ее во вторую таблицу. Я не уверен, как я могу выполнить вторую часть этого - загрузку в произвольную таблицу Foo из резервной копии. Я хочу сделать это с помощью PHP.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 24 июня 2009

Это обзор:

Ваш ответ действительно зависит от того, насколько велика ваша таблица и сколько времени вы можете выдержать для блокировки чтения. много записей могут быть скопированы за 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 секунды для 333 935 записей приличного размера.

           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. Это может открыть дополнительные проблемы безопасности, с которыми вы, возможно, не захотите бороться.

2 голосов
/ 24 июня 2009

Я бы использовал SELECT...INTO OUTFILE и LOAD DATA INFILE для достижения этой цели.

У вас большая гибкость, и она будет работать намного быстрее.

1 голос
/ 24 июня 2009

Я собирался предложить использовать php myadmin и нажать на вкладку операций. Там есть процедура копирования таблицы. Если это будет происходить постоянно, следует создать новую таблицу и вставить содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...