MySQL & Django висит на огромной сессии удалить - PullRequest
1 голос
/ 18 апреля 2011

Я использую сайт django с MySQL в качестве базы данных.Наконец, у меня есть 3 миллиона строк в таблице django_session.Срок действия большинства из них истек, поэтому я хочу их удалить.Но если я вручную запускаю delete from django_session where expire_date < "2011-04-18", весь сайт кажется зависшим - к нему нельзя получить доступ через браузер.

Почему такая блокировка возможна?Как этого избежать?

Ответы [ 4 ]

5 голосов
/ 18 апреля 2011

Если ваша таблица MyISAM, операции DELETE блокируют таблицу, и она не доступна для одновременных запросов.

Если нужно удалить много записей, таблица заблокирована слишком долго.

Разделите ваше заявление DELETE на несколько более коротких партий.

1 голос
/ 18 апреля 2011

Я не эксперт MySQL, но я предполагаю, что MySQL блокирует таблицу для удаления, и это может быть связано с транзакцией / бэкэндом MySQL.В процессе удаления MySQL блокирует доступ к таблице из других соединений.Поведение сервера MyISAM и InnoDB может отличаться.Я предлагаю вам изучить руководство по MySQL, связанное с этим: проблема не ограничивается доменом Django, а, как правило, как удалить строки MySQL, не блокируя доступ к таблице.

Для дальнейшего использования я предлагаю вам настроить задачу очистки сессий, которая будет очищать сессии, скажем, раз в день, от cron, чтобы у вас не было такой огромной таблицы.

0 голосов
/ 18 апреля 2011

Если я правильно помню, в столбце expire_date нет индекса Работа с большим количеством строк займет некоторое время.В то время как это происходит, оно также будет держать блокировку на таблице (по крайней мере, в MyISAM).

Возможно, вам будет лучше удалить удаление на основе первичного ключа (например, id), пока в таблице django_session не будет меньше строк.Как только у вас будет меньше строк, вы можете добавить индекс к expire_date и убедитесь, что вы регулярно запускаете команду cleanup .

Вам нужно будет оценить, откуда начать удаление, но при условии, чтовы знаете, что все строки с идентификатором менее 2 900 000 необходимо удалить:


delete from django_session where id < 29000000;

Чтобы избежать блокировки таблицы слишком долго, вы можете захотеть удалять несколько тысяч строк за раз, каждая в своей собственной транзакции,например,


begin;
delete from django_session where id < 10000;
commit;
begin;
delete from django_session where id < 20000;
commit;
...
begin;
delete from django_session where id < 29000000;
commit;

Конечно, вам, вероятно, следует создать скрипт для этого.

Как правило, вы хотите удалять меньше строк за раз.В целом, это займет больше времени, но не должно блокировать ваш сайт слишком долго за один раз.

0 голосов
/ 18 апреля 2011

Вы можете попробовать пример команды очистки - http://docs.djangoproject.com/en/dev/topics/http/sessions/?from=olddocs#clearing-the-session-table - который удаляет все сеансы с истекшим сроком, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...