[help] Удаление не использоваемых аккаунтов
Доброго времени суток!
Хотел попросить кого-то выложить SQL запрос на удаление аккаунтов которые уже не используются 3 месяца.
Зарание благодарен!
Скрипт для очистки базы ява сервера:
суть простая, удаляются чары и все вещи и прочее ниже определенного времени или не заходившие с какого то времени.
DELETE FROM characters WHERE lastAccess < 1191211200;
DELETE FROM accounts WHERE lastactive < 1191211200;
DELETE FROM characters WHERE level < 75;
DELETE FROM characters WHERE account_name NOT IN (SELECT login FROM accounts); DELETE FROM accounts WHERE login NOT IN (SELECT account_name FROM characters); DELETE FROM clan_data WHERE leader_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM clan_privs WHERE clan_id NOT IN (SELECT clan_id FROM clan_data); DELETE FROM clan_subpledges WHERE clan_id NOT IN (SELECT clan_id FROM clan_data); DELETE FROM clan_wars WHERE clan1 NOT IN (SELECT clan_id FROM clan_data); DELETE FROM clan_wars WHERE clan2 NOT IN (SELECT clan_id FROM clan_data); DELETE FROM auction_bid WHERE bidderId NOT IN (SELECT clan_id FROM clan_data); DELETE FROM clanhall_functions WHERE hall_id NOT IN (SELECT ID FROM clanhall WHERE ownerId <> '0');
UPDATE clanhall SET paidUntil='0' WHERE ownerId NOT IN (SELECT clan_id FROM clan_data); UPDATE clanhall SET ownerId='0' WHERE ownerId NOT IN (SELECT clan_id FROM clan_data); DELETE FROM account_data WHERE account_name NOT IN (SELECT login FROM accounts); DELETE FROM account_data WHERE account_name NOT IN (SELECT account_name FROM characters); DELETE FROM account_data WHERE value NOT IN (SELECT obj_Id FROM characters); DELETE FROM items WHERE loc <> 'clanwh' and owner_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM items WHERE loc = 'clanwh' and owner_id NOT IN (SELECT clan_id FROM clan_data); DELETE FROM character_skills WHERE char_obj_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_skills_save WHERE char_obj_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_shortcuts WHERE char_obj_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_recipebook WHERE char_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_quests WHERE char_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_macroses WHERE char_obj_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_hennas WHERE char_obj_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_friends WHERE char_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM character_subclasses WHERE char_obj_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM couples WHERE player1Id NOT IN (SELECT obj_Id FROM characters); DELETE FROM couples WHERE player2Id NOT IN (SELECT obj_Id FROM characters); DELETE FROM pets where item_obj_id not in (SELECT object_id FROM items); DELETE FROM seven_signs WHERE char_obj_id NOT IN (SELECT obj_Id FROM characters); DELETE FROM forums WHERE forum_owner_id <> '0' AND forum_owner_id NOT IN (SELECT clan_id FROM clan_data);
P.S Не моё. (Взято из Библиотеки La2base)
спасибо...но это у меня тоже есть) мне важно было узнать как выставить ласт ексес именно на 3 месяца! тоесть 3 месяца уже не использоваемые аккаунты. Если ктото знает - с меня пасибка!
smart-one: как выставить ласт ексес именно на 3 месяца! тоесть 3 месяца уже не использоваемые аккаунты.
ласт ексес на 3 месяца, это не 3 месяца не используемый аккаунт, а 3 месяца неиспользуемый чар. 3 месяца не используемый аккаунт - lastactive
Для таблицы accounts и промежутка в 3 месяца запрос будет примерно такой:
- date_diff(date1,date2) - возвращает разницу в днях между date1 и date2
- curdate() - возвращает текущую дату
- date (datetime) - возвращает дату из datetime
- from_unixtime(unixtimestamp) возвращает sqltimestamp
90, соответственно, примерное количество дней в 3 месяцах
DELETE FROM accounts WHERE datediff(curdate(),date(from_unixtime(floor(lastactive/1000))))>90 - что означает 1000 перед 90?
и можно точно? чтоб удалить все аки которыми не пользуются уже 3 месяца надо сделать этот запрос в точности?
DELETE FROM accounts WHERE datediff(curdate(),date(from_unixtime(floor(lastactive/1000))))>90
Cервер записывает в поле lastactive время в миллисекундах, функция from_unixtime использует время в секундах. Поэтому значение поля в запросе надо делить на 1000.
Этот запрос удалит аккаунты, которыми не пользуются уже 90 дней (т.е. условно 3 месяца).
Дальше надо будет выполнить запросы, которые писали выше - чтобы удалить всех чаров, которые остались без акков; все вещи которые остались без хозяев; кланы, которые остались без КЛ и так далее.
Всё это, разумеется, надо делать при выключенном сервере, и перед тем как делать - позаботиться о бэкапе.
Спасибо!
Только можно ещё просьбу - напишите полный запрос для того чтоб удалить все аки (на 90 дней) и всё что было с ними связано...с меня 1000 раз пасибка!
tiesto: на которые и которыми не заходят 2 недели и месяц. Помогайте профи) Тема гуд...
2 недели = 14 дней. Месяц=30 дней.
tynukk же написал запросы на удаление всего и вся, у чего нет хозяина - начиная с четвёртого DELETE - просто почитайте и разберитесь, что там удаляется.
_http://www.unixtimestamp.com/index.php
Вот ссылко на перевод впемени в юникс. Я надыбал... думаю поможет кому-то.
Я переделываю запрос, дошел до ошибки и немогу разрулить, вот скрин:
Юзаю Ему-Рт и такой код
UPDATE characters SET online=0;
DELETE FROM characters WHERE lastAccess < 1248066000;
DELETE FROM accounts WHERE lastactive < 1248066000;
DELETE FROM characters WHERE level < 75;
DELETE FROM characters WHERE account_name NOT IN (SELECT login FROM accounts);
DELETE FROM accounts WHERE login NOT IN (SELECT account_name FROM characters);
DELETE FROM clan_data WHERE leader_id NOT IN (SELECT charId FROM characters);
DELETE FROM clan_privs WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_subpledges WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_wars WHERE clan1 NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_wars WHERE clan2 NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM auction_bid WHERE bidderId NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clanhall_functions WHERE hall_id NOT IN (SELECT ID FROM clanhall WHERE ownerId <> '0');
UPDATE clanhall SET paidUntil='0' WHERE ownerId NOT IN (SELECT clan_id FROM clan_data);
UPDATE clanhall SET ownerId='0' WHERE ownerId NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM accounts WHERE account_name NOT IN (SELECT login FROM accounts);
DELETE FROM accounts WHERE account_name NOT IN (SELECT account_name FROM characters);
DELETE FROM accounts WHERE value NOT IN (SELECT charId FROM characters);
DELETE FROM items WHERE loc <> 'clanwh' and owner_id NOT IN (SELECT charId FROM characters);
DELETE FROM items WHERE loc = 'clanwh' and owner_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM character_skills WHERE char_obj_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills_save WHERE char_obj_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_shortcuts WHERE char_obj_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_recipebook WHERE char_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_quests WHERE char_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_macroses WHERE char_obj_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_hennas WHERE char_obj_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_friends WHERE char_id NOT IN (SELECT charId FROM characters);
DELETE FROM character_subclasses WHERE char_obj_id NOT IN (SELECT charId FROM characters);
DELETE FROM couples WHERE player1Id NOT IN (SELECT charId FROM characters);
DELETE FROM couples WHERE player2Id NOT IN (SELECT charId FROM characters);
DELETE FROM pets where item_obj_id not in (SELECT object_id FROM items);
DELETE FROM seven_signs WHERE char_obj_id NOT IN (SELECT charId FROM characters);
DELETE FROM forums WHERE forum_owner_id <> '0' AND forum_owner_id NOT IN (SELECT clan_id FROM clan_data);
— АдмиралЪ О_о
Пишет неизвестная колонка, но когда ранее било ошибку на колонку obj_Id которой у меня нету, а вместо нее есть charId , сменив я решил проблемку, потом account_data я сменил на accounts. Терь оно кричит на колонку account_name в таблице чаров... но она у меня там есть!!! Перелопатил все варианты, на которые я способен) Прогеры спасайте)
— АдмиралЪ О_о
Ты лучше показывай отдельный запрос, на который выдаёт ошибку, саму ошибку и структуру таблиц, которые участвуют в запросе.. так цитировать легче :).
Последний запрос который у тебя на скрине, наверное, неправильный - в таблице accounts нет поля account_name. Во всяком случае, у меня. Поэтому запрос DELETE from accounts WHERE account_name NOT IN (SELECT login FROM accounts) не выполнится.
VlLight: Ты лучше показывай отдельный запрос, на который выдаёт ошибку, саму ошибку и структуру таблиц, которые участвуют в запросе.. так цитировать легче :).
Последний запрос который у тебя на скрине, наверное, неправильный - в таблице accounts нет поля account_name. Во всяком случае, у меня. Поэтому запрос DELETE from accounts WHERE account_name NOT IN (SELECT login FROM accounts) не выполнится.
DELETE FROM characters WHERE account_name NOT IN (SELECT login FROM accounts);
Все строки указанные сдесь у меня имеются в таблицах, вот скрин таблиц accounts и characters


если перевести достловно
удалить чаров не имеющих имени аккаунта (смотреть колонку login в таблице accounts) так???? Дак хули оно не пашет???
— АдмиралЪ О_о
Кароч раздуплился еле...
Вот работающий запрос на сборки Ему-Рт и Ему
UPDATE characters SET online=0;
DELETE FROM characters WHERE lastAccess < 1248469200;
DELETE FROM accounts WHERE lastactive < 1248469200;
DELETE FROM characters WHERE level < 75;
DELETE FROM characters WHERE account_name NOT IN (SELECT login FROM accounts);
DELETE FROM accounts WHERE login NOT IN (SELECT account_name FROM characters);
DELETE FROM clan_data WHERE leader_id NOT IN (SELECT charId FROM characters);
DELETE FROM clan_privs WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_subpledges WHERE clan_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_wars WHERE clan1 NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clan_wars WHERE clan2 NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM auction_bid WHERE bidderId NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM clanhall_functions WHERE hall_id NOT IN (SELECT ID FROM clanhall WHERE ownerId <> '0');
UPDATE clanhall SET paidUntil='0' WHERE ownerId NOT IN (SELECT clan_id FROM clan_data);
UPDATE clanhall SET ownerId='0' WHERE ownerId NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM items WHERE loc <> 'clanwh' and owner_id NOT IN (SELECT charId FROM characters);
DELETE FROM items WHERE loc = 'clanwh' and owner_id NOT IN (SELECT clan_id FROM clan_data);
DELETE FROM character_skills WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_skills_save WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_shortcuts WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_recipebook WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_quests WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_macroses WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_hennas WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_friends WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM character_subclasses WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM couples WHERE player1Id NOT IN (SELECT charId FROM characters);
DELETE FROM couples WHERE player2Id NOT IN (SELECT charId FROM characters);
DELETE FROM pets where item_obj_id not in (SELECT object_id FROM items);
DELETE FROM seven_signs WHERE charId NOT IN (SELECT charId FROM characters);
DELETE FROM forums WHERE forum_owner_id <> '0' AND forum_owner_id NOT IN (SELECT clan_id FROM clan_data);
— АдмиралЪ О_о
Вместо
Удобнее всё-таки использовать
Можно в удобном виде поставить количество дней и не париться с пересчётом в миллисекунды.
Удалит всех чаров ниже 75 уровня - оно вам надо? :)
DELETE FROM characters WHERE datediff(curdate(),date(from_unixtime(floor(lastAccess/1000))))>90
для персонажей так?
сделал так как писалось но пишет что запрос не коректен( все колонки правильно вписаны....
Ещё можно удалить аккаунты , которые создали , но ни разу не заходили на них.
Navicat->accounts->Filter Wizard->
lastIp-contains=is Null
жмёшь ctrl+r
далее у тебя появятся акки , на которые ни разу не заходили.
далее разворачиваешь окошко , дабы было удобнее ( окно навиката )
Жмёшь CTRL+A и удаляешь.
Я таким способом удалил 14 000 аккаунтов
— ы


