Найпростіший спосіб копіювання таблиці з однієї бази даних в іншу?


151

Який найкращий спосіб скопіювати дані з таблиці в одній базі даних до таблиці в іншій базі даних, коли бази даних працюють у різних користувачів?

Я знаю, що можу використовувати

INSERT INTO database2.table2 SELECT * from database1.table1

Але тут проблема полягає в тому, що обидва database1і database2знаходяться під різними користувачами MySQL. Таким чином, user1можна отримати доступ database1лише та user2отримати доступ database2лише до них. Будь-яка ідея?


6
Ви можете надати гранти на рівні таблиці користувачам. дивіться: dev.mysql.com/doc/refman/5.5/uk/grant.html
Омеш

2
На жаль, це не працює в моєму випадку, оскільки я використовую сервер хостингу для спільного використання Godaddy. Вони не дозволяють робити такі речі з базою даних.
Спаркі

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

Я знаю, що ви можете використовувати RENAME для переміщення таблиць, і це дуже швидко. Чи існує еквівалентний трюк для копіювання таблиць?
Дан

BTW: Вам потрібно буде подбати про те, щоб список полів був в одному порядку в обох таблицях. В іншому випадку потрібно буде вибрати поля за назвою з таблиці в базі даних1, щоб вони відповідали правильним полям таблиці в базі даних2. Ця проблема виникла для мене там, де я створив резервну копію бази даних, де було змінено 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 між трубками.

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

Проблема з цим полягає в тому, що коли воно автоматизовано, ви повинні показати пароль. Якщо це не автоматизовано і робиться користувачем з командного рядка, це нормально.
Неллес

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

де db1 - місце призначення, а db2 - джерело


Чи працює це, якщо два користувачі не мають дозволу на вибір даних один у одного?
Берилій

1
однак це не буде працювати на різних серверах mysql?
PUG

8
Це не копіює над індексами
bcoughlan

@Beryllium ні, це не вимагає від користувача дозволу для обох БД. jaminator ні, це не працюватиме на різних серверах, але я не думаю, що про це ставили питання. bcoughlan ви маєте рацію. це великий недолік у цьому підході: він не належним чином зберігає структуру таблиці.
thomasrutter

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

60

Якщо ви використовуєте PHPMyAdmin, це може бути дуже просто. Припустимо, у вас є такі бази даних:

DB1 & DB2

У DB1 є користувачі таблиці, які ви хочете скопіювати в DB2

Під PHPMyAdmin відкрийте DB1 та перейдіть до таблиці користувачів.

На цій сторінці натисніть на вкладку "Операції" у верхньому правому куті. У розділі Операції шукайте розділ Копіювати таблицю в (database.table):

& ви зробили!


1
Мертвий простий! Це коли я можу відзначити лінивий!
Даніель Дат

1
Ви економите мій час .. Я робив наївний підхід. Перший експорт, а потім імпорт.
Hamza Zafeer

1
Жоден з інших відповідей не працює, тільки ваша, яка копіює також індекс
Bsienn

1
Це не спрацювало, якби таблиця була особливо великою, тобто понад 4 Гб. Наприклад, у мене є таблиця розміром 22 Гб, з якою phpMyAdmin просто не може працювати.
Марк D

1
Ідеальна відповідь. Не знав про цю особливість phpmyadmin.
zookastos

23

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

Інструмент з міграції баз даних від MySql Workbench

Це легко впорається з проблемами міграції. Ви можете перемістити вибрані таблиці вибраних баз даних між MySql та SqlServer. Спробуйте спробувати напевно.


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

Ні, я не пробував SQLYog.
mmdemirbas

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

2
Цікаво, але програма перехопила миграцію з великою базою даних, командний рядок працював найкраще.
Клаудіонор Олівейра

1
@mmdemirbas, " Ви можете мігрувати вибрані таблиці вибраних баз даних між MySql і SqlServer. " Питання ОП не стосується SQL Server.
sampablokuper

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/uk/create-table-like.html


1
Він не буде копіювати Дані! Прочитайте документацію, на яку ви
посилалися

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;

що з іншими індексами ?! Питання передбачає скопіювати таблицю не лише її даних
Джордж

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;


Це допомогло мені автоматизувати копіювання бази даних, не використовуючи програму gui, дякую.
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 рядків - ймовірно, через великі розміри.
Спаркі

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

Інструмент командного рядка mysqldump не має проблем з 1 мільйоном рядків або декількома мільярдами рядків - все, що впливатиме на те, скільки часу займає і яка частина вашого жорсткого диска займає результат (якщо ви виведете його у файл). Мій досвід роботи з командою експорту phpMyAdmin полягає в тому, що він набагато обмежений, ніж mysqldump.
thomasrutter

1

скопіюйте нижче кроки, щоб скопіювати та вставити деякі стовпці з однієї таблиці бази даних в іншу таблицю бази даних-

  1. СТВОРИТИ ТАБЛИЦІ ім’я таблиці (тип даних (ім'я стовпця), тип даних (ім'я) стовпця (розмір));

2.INSERT INTO db2.tablename SELECT ім'я стовпця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

IN xampp просто експортуйте потрібну таблицю у вигляді .sql-файлу, а потім імпортуйте її до потрібного


-1

створіть таблицю target_customer на зразок sakila.customer (Database_name.tablename), це лише скопіює структуру таблиці вихідного коду, для того, щоб дані також були скопійовані зі структурою, це створіть таблицю target_customer як select * з sakila.customer


Здається, це відповідь на зовсім інше питання. Нічого CREATE TABLE LIKEв питанні, то навіщо згадувати, що це неправильно? І немає пояснення, як ця відповідь вирішує проблему, що жоден користувач не має доступу до таблиць іншого.
Toby Speight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.