MemSQL - почему я не могу сделать вставку между базами данных в .. select

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

insert into db_a.target_table (field1,field2,field3) select field1,field2,field3 from db_b.source_table; 

Сообщение об ошибке кажется простым.

MemSQL не поддерживает этот тип запроса: кросс-база данных INSERT ... SELECT

Как ни странно, этот пример работает:

insert into db_a.target_table select * from db_b.source_table;

Но это похоже на такой распространенный сценарий. Кто-нибудь сталкивался с подобной проблемой, и удалось ли вам ее обойти?


person Ron Stiffler    schedule 16.09.2015    source источник


Ответы (1)


К сожалению, это не разрешено, потому что такие запросы трудно поддерживать транзакционными; транзакции с несколькими операторами используются внутри, чтобы гарантировать транзакционность единственной вставки-выборки (если один раздел выходит из строя (дупликация ключа или что-то еще), мы хотим отменить все!). Поскольку у нас нет транзакций с несколькими инструкциями между БД (пока!), у нас нет вставки-выбора между БД (пока!).

Оставайтесь с нами для более приятных решений.

Однако, если вы ДЕЙСТВИТЕЛЬНО хотите это сделать, вот что вам нужно сделать. Однако,

ДЕЙСТВУЙТЕ НА СВОЙ РИСК. ЭТО НЕ ПОДДЕРЖИВАЕМАЯ ПРОЦЕДУРА.

Но это должно работать.

1) На db_b создайте таблицу с теми же столбцами, что и на source_table, но сделайте ключ осколка SHARD().

2) На db_a запустите SHOW PARTITIONS.

3) Для каждого из этих разделов создайте соединение с db_a_<ordinal> на хосте и порту, указанном в SHOW PARTITIONS. Запустите SHOW DATABASES для этого подключения, и вы увидите несколько баз данных с именем db_b_<another>. Выберите один, неважно какой. Выполнить INSERT INTO db_b<another>.source_table SELECT * from db_a_<ordinal>.source_table.

3.5) На данный момент вы еще не писали в интересующую вас таблицу, но теперь мы это сделаем. Посмотрите на db_b.source_table. Все ли правильно? Все данные есть? Запустите SHOW CREATE TABLE и дважды проверьте, что ключ сегмента — SHARD KEY () (он должен быть в комментариях). Все выглядит хорошо? Хорошо, мы можем продолжить.

4) После того, как вы сделаете это для КАЖДОГО раздела, вы можете сделать INSERT INTO db_b.target_table (cols) SELECT cols from db_b.source_table или что угодно.

Удачи!

person Joseph Victor    schedule 16.09.2015