К сожалению, это не разрешено, потому что такие запросы трудно поддерживать транзакционными; транзакции с несколькими операторами используются внутри, чтобы гарантировать транзакционность единственной вставки-выборки (если один раздел выходит из строя (дупликация ключа или что-то еще), мы хотим отменить все!). Поскольку у нас нет транзакций с несколькими инструкциями между БД (пока!), у нас нет вставки-выбора между БД (пока!).
Оставайтесь с нами для более приятных решений.
Однако, если вы ДЕЙСТВИТЕЛЬНО хотите это сделать, вот что вам нужно сделать. Однако,
ДЕЙСТВУЙТЕ НА СВОЙ РИСК. ЭТО НЕ ПОДДЕРЖИВАЕМАЯ ПРОЦЕДУРА.
Но это должно работать.
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