Самый простой способ скопировать таблицу из одной базы данных в другую?


152

Как лучше всего скопировать данные из таблицы в одной базе данных в таблицу в другой базе данных, если базы данных принадлежат разным пользователям?

Я знаю, что я могу использовать

INSERT INTO database2.table2 SELECT * from database1.table1

Но тут проблема в том, что оба database1и database2находятся под разными пользователями MySQL. Так user1может получить доступ database1только и user2может получить доступ database2только. Любая идея?


6
Вы можете предоставить пользователям уровень доступа на уровне таблицы. см. dev.mysql.com/doc/refman/5.5/en/grant.html
12:00

2
К сожалению, в моем случае это не сработает, так как я использую хостинг-сервер Godaddy. Они не позволят делать такие вещи с базой данных.
Sparky

@mmdemirbas Одна таблица в базе данных содержит почти 1 миллион строк. Дамп базы данных будет огромным. Кроме того, когда я пытался экспортировать, экспортировалось только около 10000 строк - вероятно, из-за большого размера.
Sparky

Я знаю, что вы можете использовать RENAME для перемещения таблиц, и это очень быстро. Есть ли эквивалентный трюк для копирования таблиц?
Дан

Кстати: вам нужно позаботиться о том, чтобы список полей был в одинаковом порядке в обеих таблицах. В противном случае необходимо будет выбрать поля по имени из таблицы в database1, чтобы они соответствовали правильным полям в таблице в database2. Эта проблема возникла у меня, когда я создал резервную копию базы данных, в которой таблица table1 была изменена после первоначального создания, и новой базы данных, в которой она была создана из файла mysqldump.
Стив Л

Ответы:


113

Если у вас есть доступ к оболочке, вы можете использовать его mysqldumpдля выгрузки содержимого и передачи database1.table1его по mysqlадресу database2. Проблема в том, что table1это все еще table1.

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

Может быть , вам нужно переименовать , table1чтобы table2с другим запросом. С другой стороны, вы можете использовать sed, чтобы изменить table1 на table2 между каналами to.

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

Если table2 уже существует, вы можете добавить параметры в первый mysqldump, который не позволяет создавать таблицы-создает.

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

Проблема в том, что когда он автоматизирован, вы должны показать пароль. Если не автоматизировано и выполняется пользователем из командной строки, это нормально.
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

где db1 - пункт назначения, а db2 - источник


Работает ли это, если два пользователя не имеют прав выбора данных друг от друга?
Бериллий

1
это не будет работать на разных серверах MySQL хотя?
PUG

8
Это не копирует индексы
bcoughlan

@Beryllium no, для этого требуется, чтобы у пользователя были разрешения для обеих БД. jaminator нет, это не будет работать на разных серверах, но я не думаю, что вопрос был об этом. bcoughlan вы правы. это большой недостаток в этом подходе: он не сохраняет структуру таблицы должным образом.
Томасрутер

4
Скопированная таблица не имеет первичного ключа и автоматического приращения. Вы должны запустить это послеALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Уэстон Гангер

61

Если вы используете PHPMyAdmin, это может быть очень просто. Предположим, у вас есть следующие базы данных:

DB1 & DB2

DB1 имеет таблицу пользователей, которую вы хотите скопировать в DB2

Под PHPMyAdmin откройте DB1, затем перейдите к таблице пользователей.

На этой странице нажмите на вкладку «Операции» в правом верхнем углу. В разделе «Операции» найдите раздел « Копировать таблицу в (database.table)»:

& вы сделали!


1
Смертельно просто! Это когда я могу праздновать быть ленивым!
Даниэль Дат

1
Вы экономите мое время. Я делал наивный подход. Сначала экспортировал, а затем импортировал.
Хамза Зафеер

1
Ни один из других ответов не работает, только ваш, который также копирует индекс
Bsienn

1
Это не сработало бы, если таблица была особенно большой, то есть превышала 4 ГБ. Например, у меня есть таблица размером 22 ГБ, с которой phpMyAdmin просто не может работать.
Марк Д

1
Идеальный ответ. Не знал об этой функции phpmyadmin.
zookastos

23

MySql Workbench : настоятельно рекомендуется

Инструмент для миграции баз данных из MySql Workbench

Это легко решит проблемы миграции. Вы можете переносить выбранные таблицы выбранных баз данных между MySql и SqlServer. Вы должны обязательно попробовать.


Я собираюсь попробовать, у меня есть настройка, но интересно, сравнивали ли вы mysql Workbenchмиграцию SQLYogс копией базы данных? На мой взгляд, кажется, что они очень похожи, но mysql workbench - более новая функция
wired00

Нет, я не пробовал SQLYog.
mmdemirbas

Не ясно, как перейти на SQL Server из MySQL с помощью MySql Workbench. Я нахожусь в Workbench и не нахожу никаких подсказок от помощи или пользовательского интерфейса. Я знаю, что SSMA для MySQL работает для меня.
subsci

2
Интересно, что программа поймала выполнение миграции с большой базой данных, командная строка работала лучше всего.
Клаудионор Оливейра

1
@mmdemirbas, « Вы можете переносить выбранные таблицы выбранных баз данных между MySql и SqlServer». Однако вопрос OP не касается SQL Server.
Сампаблокупер

19

Я использую Navicat для MySQL ...

Это делает все манипуляции с базой данных легкими!

Вы просто выбираете обе базы данных в Navicat и затем используете.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

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

С 5.6.10 вы можете сделать

CREATE TABLE new_tbl LIKE orig_tbl;

См. Документацию здесь: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html


1
Это не будет копировать данные! Прочитайте документацию, на которую вы ссылались:> ** CREATE TABLE ... LIKE не сохраняет никаких данных **
dgpro

11

Если ваши таблицы находятся на одном сервере MySQL, вы можете запустить следующее

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;

как насчет других индексов ?! Вопрос гласит, чтобы скопировать таблицу не только ее данные
Jorj

9

Используйте функции экспорта и импорта MySql Workbench. Шаги:
1. Выберите значения, которые вы хотите

E.g. select * from table1; 
  1. Нажмите на кнопку «Экспорт» и сохраните ее как CSV.
  2. создать новую таблицу, используя аналогичные столбцы, как первый

    E.g. create table table2 like table1; 
  3. выбрать все из новой таблицы

    E.g. select * from table2;  
  4. Нажмите «Импорт» и выберите файл CSV, который вы экспортировали на шаге 2

Пример кнопок «Экспорт» и «Импорт» в MySql Workbench


1
Я думаю, это работает только для таблиц с количеством строк менее миллиарда.
Диого Паим

9

Вот еще один простой способ:

  1. использовать DB1; показать создать таблицу TB1;
    • Скопируйте синтаксис здесь в буфер обмена, чтобы создать TB1 в DB2
  2. использовать DB2;
    • вставьте сюда синтаксис для создания таблицы TB1

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;


Это помогло мне автоматизировать копирование базы данных, без необходимости использовать программу с графическим интерфейсом, спасибо.
New2HTML

4

Попробуй mysqldbcopy( документация )

Или вы можете создать « федеративную таблицу » на целевом хосте. Объединенные таблицы позволяют видеть таблицу с другого сервера базы данных, как если бы она была локальной. ( документация )

После создания федеративной таблицы вы можете скопировать данные с обычного insert into TARGET select * from SOURCE


1
Я читал о федеративных таблицах, но Amazon RDS (прямо сейчас) не поддерживает его ... XP
Chococroc

4

С MySQL Workbench вы можете использовать Экспорт данных, чтобы выгрузить только таблицу в локальный файл SQL (Только данные, Только структура или Структура и данные), а затем Импорт данных, чтобы загрузить ее в другую БД.

Вы можете одновременно открыть несколько соединений (разные хосты, базы данных, пользователи).


3

Один простой способ получить все необходимые запросы - использовать данные из information_schema и concat.

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

Затем вы получите список результатов, который выглядит следующим образом:

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

Затем вы можете просто выполнить эти запросы.

Однако это не будет работать с MySQL Views. Вы можете избежать их, добавив AND TABLE_TYPE = 'BASE TABLE'из исходного запроса:


1

Это то, что вам нужно делать регулярно или только один раз?

Вы можете сделать экспорт (например, используя phpMyAdmin или аналогичный), который запишет вашу таблицу и ее содержимое в текстовый файл, а затем вы можете повторно импортировать его в другую базу данных.


Мне нужно сделать это только один раз. Но проблема в том, что таблица в базе данных насчитывает почти 1 миллион строк. Дамп базы данных будет огромным. Кроме того, когда я пытался экспортировать, экспортировалось только около 10000 строк - вероятно, из-за большого размера.
Sparky

Ах да, это ограничение. Эта статья WordPress Codex может помочь? Это WordPress статья, но может дать вам некоторое представление (есть раздел о том, как сделать дамп таблиц с помощью командной строки, в случае, когда БД слишком велика для phpMyAdmin для обработки).
Сепстер

У инструмента командной строки mysqldump нет проблем с 1 миллионом строк или несколькими миллиардами строк - все, что от этого зависит, это то, сколько времени это займет и сколько вашего жесткого диска занимает результат (при условии, что вы вывели его в файл). Мой опыт работы с командой экспорта phpMyAdmin заключается в том, что она намного более ограничена, чем mysqldump.
Томасруттер

1

Используйте следующие шаги для копирования и вставки некоторых столбцов из одной таблицы базы данных в другую таблицу базы данных.

  1. CREATE TABLE имя таблицы (тип данных столбца (размер), тип данных столбца (размер));

2.INSERT INTO db2.tablename ВЫБРАТЬ имя столбца1, имя столбца2 ОТ db1.tablename;


1

Сначала создайте дамп. Добавлены --no-create-info --no-create-dbфлаги, если они table2уже существуют:

mysqldump -u user1 -p database1 table1 > dump.sql

Затем введите user1пароль. Затем:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

Затем введите user2пароль.

То же, что и ответ @helmors, но этот подход более безопасен, поскольку пароли не отображаются в текстовом виде на консоли (обратный поиск, перехватчики паролей и т. Д.). Другой подход хорош, если он выполняется из файла сценария с соответствующими ограничениями на его разрешения.


0

В xampp просто экспортируйте нужную таблицу в виде файла .sql, а затем импортируйте ее в нужный


-1

создайте таблицу destination_customer, например sakila.customer (Database_name.tablename), при этом будет скопирована только структура исходной таблицы, для того чтобы данные также копировались со структурой, выполните эту операцию, чтобы создать таблицу destination_customer как select * from sakila.customer


Кажется, это ответ на совершенно другой вопрос. Там нет CREATE TABLE LIKEв вопросе, так зачем упоминать, что это неправильно? И нет никакого объяснения того, как этот ответ решает проблему того, что ни один пользователь не имеет доступа к таблицам другого.
Тоби Спейт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.