powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поведение при переименовывании таблицы внутри транзакции InnoDB
7 сообщений из 7, страница 1 из 1
Поведение при переименовывании таблицы внутри транзакции InnoDB
    #38708706
Архибабай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть база, в которую собираются логи. Для уменьшения таблицы логов есть механизм, позволяющий часть данных за определенный период держать в другой таблице. Чтобы не кидать большие объемы между таблицами выбран вариант переименовывать таблицу и создавать новую для новых логов. Приложение на это время останавливать нельзя. Вот тут и вопрос: если внутри транзакции переименовать таблицу и создать новую, могут ли возникнуть проблемы с запросами, которые в это время параллельно пытаются добавить записи? Не пропадут ли они? Может стоит локать таблицу?
...
Рейтинг: 0 / 0
Поведение при переименовывании таблицы внутри транзакции InnoDB
    #38708789
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АрхибабайДля уменьшения таблицы логов есть механизм, позволяющий часть данных за определенный период держать в другой таблице. Чтобы не кидать большие объемы между таблицами выбран вариант переименовывать таблицу и создавать новую для новых логов.Хуже было сложно что-то придумать - DDL в клиентском приложении, да ещё и в транзакции... если там гигабайты немеряные, партиционируйте таблицу по используемому критерию (дата-время записи?), что ли, или merge engine задействуйте для секционирования...
...
Рейтинг: 0 / 0
Поведение при переименовывании таблицы внутри транзакции InnoDB
    #38708818
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АрхибабайЗдравствуйте.
Есть база, в которую собираются логи. Для уменьшения таблицы логов есть механизм, позволяющий часть данных за определенный период держать в другой таблице. Чтобы не кидать большие объемы между таблицами выбран вариант переименовывать таблицу и создавать новую для новых логов. Приложение на это время останавливать нельзя. Вот тут и вопрос: если внутри транзакции переименовать таблицу и создать новую, могут ли возникнуть проблемы с запросами, которые в это время параллельно пытаются добавить записи? Не пропадут ли они? Может стоит локать таблицу?

АХТУНГ
если я верно помню, транкзанкции это механизм для селостности данных а не для структуры. тоесть нельзя в транкзанкцию толкать команды изменения структуры.

поидее если в теле транкзанкции стоит команда структуры, то это значит что перед ней(командой переименования) - сработает либо автокомит если он включон, либо ролбек если автокомит отключон.

тоесть в твоём случае получиться вот что.

транкзанкция старт
пара вставок данных например

переименовываем таблицу = завершение транкзанкции, лок таблицы и переименование её
в это время все что пыталось работать с этой таблицей, полетит с ошибками - ибо нет таблицы

создаём новую

дальше продолжилась наша работа и другая в штатном режиме

конец транкзанкции ---конец какой??? ведь не открывалась :)
...
Рейтинг: 0 / 0
Поведение при переименовывании таблицы внутри транзакции InnoDB
    #38708820
Архибабай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
ну объемы не такие большие. Если эту операцию производить раз в месяц, то таблица будет 200-300мб. Разбиение по таблицам нужно не только для ускорения запросов чтения, а еще чтобы ежедневно снимаемый дамп был адекватных размеров.
Внутри самой транзакции будут только запросы переименовывания и создания новой таблицы со старым именем. Запускал эту последовательность даже сейчас (данные за пол года, 12кк элементов) отрабатывает за 0.2 сек. Сам скрипт будет раз в месяц отрабатывать.
...
Рейтинг: 0 / 0
Поведение при переименовывании таблицы внутри транзакции InnoDB
    #38708822
Архибабай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,

понял, спасибо
...
Рейтинг: 0 / 0
Поведение при переименовывании таблицы внутри транзакции InnoDB
    #38708826
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
портиции вариант

варианты аля процедура и менять процедуру - тоже только вставки уже в другую таблицу не получиться - ибо нельзя изменить процедуру альтером(тело её)
не вариант


всё другое, это просто повесить тригер который при удалении сделает вставку в архивную, и периодически самые старые записи удалять...
...
Рейтинг: 0 / 0
Поведение при переименовывании таблицы внутри транзакции InnoDB
    #38709660
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453ролбек если автокомит отключон.Это какой-то эльфийский mysql В нашем земном варианте DDL-команды вызывают коммит:
http://dev.mysql.com/doc/refman/5.0/en/commit.html Beginning a transaction causes any pending transaction to be committed. See Section 13.3.3, “Statements That Cause an Implicit Commit”, for more information.
http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html The statements listed in this section (and any synonyms for them) implicitly end any transaction active in the current session, as if you had done a COMMIT before executing the statement .


Data definition language (DDL) statements that define or modify database objects. ALTER TABLE, CREATE INDEX, DROP INDEX, DROP TABLE, RENAME TABLE.там есть свои нюансы, но про роллбэк - ни слова.

И вообще implicit rollback вообще выполняется в единственном случае - если автокоммит отключён, и клиент завершил сессию, не послав явно коммит.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поведение при переименовывании таблицы внутри транзакции InnoDB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]