Как перенести данные из одной базы mysql в другую, игнорируя таблицы которых нет в новой БД?
Задача перенести из одной базы данных mysql в другую данные только тех таблиц, которые есть в новой, игнорируя те, которых нет?
В идеале бы ещё это:
При этом если есть отличия в структуре самих таблиц, то приоритет отдавать структуре новой БД, игнорируя поля, которые отсутствуют в таблицах новой БД.
Сделайте 2 подключения, из одной читайте — в другую пишите.
Да — это надо сделать через бекенд лучше, дабы контролировать структуру запросов и значения
А я вот как раз ищу варианты фронтенда, чтобы было проще и не писать никакие скрипты...
Может у кого есть опыт, сделать это именно через какое-нибудь приложение...
В общем случае задача-то нерешаемая... что делать, если одноимённое поле в старой БД строковое, а в новой числовое? что делать, если в поле старой БД содержатся данные, не влезающее в поле в новой БД по размеру? Что делать, если данные в новой структуре будут противоречить целостности (скажем, внешние ключи)?
Вопросов - куча, и далеко не все из них решаемы в автоматическом режиме.
Лучше скажите - а сколько их, тех таблиц? если их в пределах сотни - то написать запросы на вставку быстрее и проще, чем заниматься фигнёй и создавать в общем не самый простой, но практически одноразовый, инструмент.
Я бы взялся примерно так.
1. Сделал копию старой базы, чтобы спокойно баловаться и ничего не испортить.
2. Выгрузил дамп (только структуру) из старой и новой баз.
3. Открыл эти дампы в каком-нибудь Meld для визуального сравнения и начал:
- удалять те таблицы из копии, которых нет в новой базе;
- писать ALTER TABLE для тех мест, где структуры не совпадают.
И таким образом пришел на копии старой базы к тому, что должно быть в новой.
Если записывать каждый DROP / ALTER TABLE - получится повторяемый скрипт миграции.
По первым 2м пунктам так и сделал сразу, прямо один в один, как написали))
А вот с пунктом 3 по подробнее, пожалуйста.
Meld - спасибо за подсказку, воткну структуры старой и новой, по ним как по карте расхождений пойду в ручную, этот инструмент, собственно и искал.
А вот с
писать ALTER TABLE,
можно немного по подробнее?
Вот, например, наткнулся я в старой БД на таблицу в которой, например, на одно поле больше, чем в новой, и я на 100% уверен, что в новой это поле мне не нужно.
Какой тогда должен быть полный код запроса в mysql для переноса старой таблицы с данными в структуру новой таблицы и игнором отсутствующих полей?
Какой тогда должен быть полный код запроса в mysql для переноса старой таблицы с данными в структуру новой таблицы и игнором отсутствующих полей?
Если прочитать описание INSERT INTO дальше первой строчки, то выяснится, что можно не звезду ставить, а указывать перечень конкретных полей, причём как в запросе на получение переносимых данных, так и в таблице назначения. И в этом перечне вовсе не обязательно должны присутствовать абсолютно все поля структуры.
Антон Пащенко, по описанному алгоритму вы должны получить базу с такими же таблицами, как в новой базе. Нет в старой такой колонки - пишем ALTER TABLE DROP COLUMN.
Мне кажется дамп всего-всего делать не надо. В MySQL же есть метаданные. Вот взять оттуда список таблиц. Потом сделать subtract такого-же списка таблиц из другой БД. И потом bash-скриптами потихоньку перенести.
mayton2019, это вам кажется. Потому что я в этом ответе предлагаю трансформацию старой БД в новую. Эта трансформация затрагивает хранящиеся данные. И делать ее без данных - значит, потерять ошибки конвертации типа неуникального значения уникального поля, проблем внешних ключей и проч.