Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
Добрый день Подскажите как правильне сделать? Есть необходимость хранить маки и IP в базе, но если раз в 5 минут просто писать в базу текущее состояние - получается очень много. медленно ищет, и долго добавляется. Написал скрипт, который просто делает diff между двумя последними состояниями и показывает различия. Примерно такие данные получаются: id datetimeflagipmacintvlans11480409401:new:1.1.158.4374867a6836f5TenGigabitEthernet0/2/0.883074521480410001:new:1.1.159.877062b8c6c70bTenGigabitEthernet0/2/0.882093131480410001:new:1.1.157.1667062b8bf9283TenGigabitEthernet0/2/0.883044041480410001:new:1.1.158.7094de80bed855TenGigabitEthernet0/2/0.876012551480412401:del:1.1.159.877062b8c6c70bTenGigabitEthernet0/2/0.882093161480412401:new:1.1.159.211001e9096632dTenGigabitEthernet0/2/0.8830260 в момент времени 1480409401 добавился 1 адрес, в 1480410001 добавилось 3 мака, а в 1480412401 добавился 1 и один из первых исчез. Эту инфу я могу прямо так и писать в базу. Но, допустим мне надо посмотреть кто был в базе в момент времени 1480410001 (если я просто сделаю datetime = 1480410001 то туда не попадет mac c id=1). Те пока нет del - нужно считать что запись в базе есть. и в селекте ее показывать. от сюда 2 вопроса: как лучше хранить такого рода информацию? если хранить прямо так, то как сделать селект что бы увидеть не удаленные записи? (когда именно запись была добавлена - заранее неизвестно. те 1480409401 может быть и 1000000001 и 1. ну если не делать доп селекта) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 15:56 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
DeeZак лучше хранить такого рода информацию?Можно прямо так и хранить - в виде "пришел во столько-то/ушел во столько-то". Желательно подобрать компактные типы данных, а не хранить все строками. Например, ip-адрес в unsigned int. Вещи, которые поддаются перечислению, лучше вынести в отдельные таблицы (например, TenGigabitEthernet и 0/2/0.8830745) Чтобы определить состояние адреса на момент времени нужно искать последнюю предыдущую запись перед эти моментом времени. Как-то так: Код: sql 1. При наличии индекса (mac,datetime) работать должно быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 17:02 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
А если искать нужно будет по адресу? Обычно надо найти кому был выдан IP с 1 по 5 января например. Если это адрес динамический там может быть от 0 до 100500 МАКов, причем может получиться так что 1 мак попадет в таблицу 31 декабря, или вообще 1 января прошлого года (мало ли), а удалится 4 и 4 же этот IP получит другой клиент. А найти нужно именно обоих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 17:31 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
DeeZА если искать нужно будет по адресу? Обычно надо найти кому был выдан IP с 1 по 5 января например.Тогда ищете двумя отдельными запросами всё в диапазоне с 1 по 5 января и еще одну последнюю запись до 1 января. И объединяете эти запросы через UNION ALL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 18:10 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
DeeZесли раз в 5 минут просто писать в базу текущее состояние - получается очень много.Раз в 5 минут - это всего 100 тыс. записей в год, мелочь. DeeZмедленно ищет, и долго добавляется.Или железо такое дохлое, или индексами в структуре даже не пахнет. Хотя при сотне байтов на запись и сотне тысяч записей всё должно летать и без индексов... замените свой сервер хотя бы на пентиум-2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 23:21 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
AkinaРаз в 5 минут - это всего 100 тыс. записей в год, мелочь.Насколько я понял, под одним разом понимается состояние всей сети. Т.е. не одна запись в таблице, а столько, сколько хостов сети в конкретный момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 23:44 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
miksoft , он пишет не состояние, а его изменение: DeeZв момент времени 1480409401 добавился 1 адрес, в 1480410001 добавилось 3 мака, а в 1480412401 добавился 1 и один из первых исчез .Для сети на сотню хостов это приблизительно удвоит объём - не разговор... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 07:57 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
Я пишу а том что у меня 10 000 записей раз в 5 минут. хранить весь список разом - много, долго, и обьективно бесполезно. Я сделал дифы, в этом случае раз в 5 минут у меня только 4-5 строк изменений (вместо мгновенного снимка в 10 000 записей). В год это 525 600 записей,если писать только диф (против 1 051 200 000 для полного состояния). Но если с полным состоянием я могу просто сделать селект и получить какие адреса сейчас используются и кем, то как это сделать если в базе только дифы - не знаю. Я заранее не знаю когда адрес начал использоваться, по этому не могу сделать селект за то число с которого нужный адерс стал занят (как предлагает miksoft). по сути, мне нужно из дифов восстановить полнйы список и сделать по нему селект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 08:24 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
DeeZесли с полным состоянием я могу просто сделать селект и получить какие адреса сейчас используются и кем, то как это сделать если в базе только дифы - не знаю. По сути тебе нужно для каждого адреса сделать выборку последнего состояния. А на эту тему у нас в разделе целый FAQ: Выборка первой/последней записи в группах написан... читай, просвещайтся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 10:17 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
DeeZпо этому не могу сделать селект за то число с которого нужный адерс стал занят (как предлагает miksoft).Я предлагаю выборку не по конкретному числу, а по последней записи перед этим числом. Это не одно и то же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 13:52 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
ФАК читал, и понимаю что, это то что нужно, но ни как не могу понять как должен выглядеть запрос в моем случае. При условии что у меня 1 база (пока.потом разобью на более удачную), как учесть Flag = 1 - адерс удален (ушел) Например, как должен выглядеть запрос типа Код: sql 1. 2. Где мак 34363b9ae000 уже ушел и должен быть удален из выборки. И Код: sql 1. 2. где мак 34363b9ae000 еще не ушел SQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 08:24 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
А где эталонный результат? И что значит ушёл / не ушёл? А так не вижу сложностев. Код: sql 1. 2. 3. 4. 5. 6. тебе даёт всё, что нужно для идентификации последней записи. По ним из второй копии таблицы получаешь всю запись, и отбираешь только те, в которых Flag = 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 08:53 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
Akina, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 10:18 |
|
||
|
Хранить в SQL diff и в дальнейшем сделать select
|
|||
|---|---|---|---|
|
#18+
Ну хотя тут еще можно выцепить не обращая внимание на флаг. но как выцепить тех кто получил раньше и освободил ползже? те вообще не попал в выборку? Например из этой выборки получить 000af5898980 при условии recdate > 1481610610 and recdate < 1481615301 (1481610601, "1","0", INET_ATON ("2.2.82.30"), CONV("000af5898980",16,10),"TenGigabitEthernet0/2/0.8610652"), (1481615401, "1","1", INET_ATON ("2.2.82.30"), CONV("000af5898980",16,10),"TenGigabitEthernet0/2/0.8610652"), ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 11:17 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=84&tid=1831085]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 359ms |

| 0 / 0 |
