Adatbázis: SQL, XML DB

postgresql 11 inet típusú oszlop lekérdezés cidr típussal - gyakoló feladat

Sziasztok!

Az alábbi lekérdezést szeretném átírni úgy hogy nem szeretnék meghívni másik táblát.

Ezzel a lekérdezésell le szeretném szűrni azokat a forgalmakat amik belülről indultak és kifelé tartanak.

inet típus:
server_address, client_address, localip3

Az index típus a server_address, client_address, localip3 gist net_ops


a localip3-ban vannak felvéve a helyi ip címek amit le szeretnék cserélni. (10.0.0.0/16 --> /32- szereltekben netmask nélkül, 10.0.0.1, 10.0.0.2, 10.0.0.3...10.254.254.254)

   localip3: (inet)
  10.0.0.1
  10.0.0.2
  10.0.0.3

 


SELECT
  log.server_zone,
  count(log.server_zone)
FROM log
WHERE
 date > now() -interval '1 hour'
 AND  log.client_address IN (SELECT iprange FROM localip3 )
 AND  log.server_address NOT IN (SELECT iprange FROM localip3 )
GROUP BY log.server_zone


Itt szépen lefut s a várt eredményt adja
SELECT
  log.server_zone,
  count(log.server_zone)
FROM log
WHERE
 date > now() -interval '1 hour'
AND  log.client_address IN (SELECT iprange FROM localip3 )
AND  log.server_address <> inet '10.0.0.0/16'
  GROUP BY log.server_zone;

de ezt a sort nem tudom átalakítani : AND  log.client_address IN (SELECT iprange FROM localip3 ), hogy megkapjam a fenti eredményt

SELECT
  log.server_zone,
  count(log.server_zone)
FROM log
WHERE
 date > now() -interval '1 hour'
 AND  inet '10.0.0.0/16' >>= log.client_address  
 AND  log.server_address <> inet '10.0.0.0/16'
GROUP BY log.server_zone;


https://www.postgresql.org/docs/11/functions-net.html
>>    contains    inet '192.168.1/24' >> inet '192.168.1.5'
>>=    contains or equals    inet '192.168.1/24' >>= inet '192.168.1/24'


köszönöm a segítséget.
(nem nem vagyok adatbázisban otthon, csak saját magamat fejleszteném, tanulnék)

 

update:

server_addres: (inet)       client_address: (inet)
   10.0.0.1                             24.25.36.88
   10.0.0.2                              10.0.0.8
  89.64.88.77                        10.0.0.1
  101.25.4.2                           10.0.0.9

A client_address-ben csa a privát IP szerepejen, minden mást hagyjon figyelmen kívűl, a server_address-ben csak a publik ipt rakja bele.

SQL hibás adatbázis probléma miatt nem indul mariadb

Sziasztok!

Szeretnék egy kis segítséget kérni. Van egy hibás tábla sql-ben, és ez miatt nem indul el mariadb.

Csak innodb_force_recovery=6 módban tudom elindítani, de így minden read only módban van, ezért nem tudom sem javítani sem törölni a hibás táblát. 

Hogyan tudnám ezt helyreállítani?

MySQL -> MariaDB lassulás

Sziasztok,

 

adott egy régi rendszer, Debian 8, MySQL 5, 2 db SATA diszken (Linux mdraid) az OS, és az egész LAMP stack. A gépben 8 CPU van és 8G RAM.

Van egy új rendszer, Debian 10, MariaDB 10, 2 db M2 SSD az OS-nek, és 2db M2 (Intel szerver) SSD a MariaDB-nek. Az SSD-k alatt van egy LSI HW raid vezérlő. A gépben 24 CPU van és 32G RAM.

Adott egy sql dump, ennek a betöltése a régi szerveren (különösebb tunnig nélkül, alapbeállításokkal):

real    17m2.267s
user    1m6.752s
sys     0m6.300s

Ugyanez az új gépen (tuning után):

real	28m12,458s
user	4m0,385s
sys	0m6,733s

Amit eddig módosítottam:

key_buffer_size        = 4096M
max_allowed_packet     = 32M
query_cache_size       = 128M
skip-log-bin
open-files-limit       = 65535
myisam_repair_threads  = 4
innodb-strict-mode     = 0

Ezek közül a myisam_repair_threads 4-re történő felemelése vitte le 32-35 percről a mostani 28-ra.

Mit lehetne/kellene még állítani, hogy legalább azt a szintet elérjük, amit a régi rendszer produkál? Az elvárás nyilván valami performancia javulás lenne, azaz gyorsabban töltődjön be a dump...

 

Köszi.

ISO 3166 magyarul

Tud valaki egy linket, ahol az ISO 3166-2 országkódok és a hozzájuk rendelt országnevek magyarul letölthetők mondjuk csv, xls vagy bármilyen formátumban? (A NAV ugyan megköveteli, de én nem találtam náluk ilyen linket, ahol ezt elérhetővé tenné.)

MEGOLDVA python datetime.now() to mysql datetime(6) == syntax error

A megoldas:

now = datetime.now()

formatted_date = now.strftime('%Y-%m-%d %H:%M:%S.%f')

mycursor.execute("INSERT INTO proba (datum) VALUES (%s)", (now.strftime('%Y-%m-%d %H:%M:%S.%f'),))
 

Sziasztok!

Kezdo vagyok mysql-ben, ezt szeretnem az elejen kijelenteni, hatha fontos lesz a kesobbiekben. :D

Van egy hazi projektem, ahol belefutottam az elso komoly problemaba...

 

Feladat:

Raspberry pi 4-en fut egy python script, ami adott beerkezo jelre keszit egy datetime.now() idot, ilyen formatumban: 2021-02-16 10:51:12.542145

Ezt az idot szeretnem elkuldeni egy tavoli mysql tablaba, de folyamatosan syntax error-ba futok bele.  Fontos, hogy szuksegem van a tizedes pont utani elso, de inkabb elso ketto karakterre(mar az elsonek is nagyon orulnek).

 

Vas amin a python fut: Raspberry pi 4 2GB model OS: Raspberry pi OS

Vas amin a mysql fut: Ubuntu 20.04.1LTS

 

Az adatok kuldes rendben van, ez a resze jo a kodnak, csak a datum helyes formatuma nem oke, gondolom en...(ha pl stringet kuldok az atmegy, ott a tabla datatype-ja varchar ebben az esetben)

 

A mysql maunalban az alabbi modon szerepel a datetime formatum:

Röviden: YYYY-MM-DD hh:mm:ss - tehat az en ertelmezesemben ebben a formaban kell hogy megkapja az erteket, hogy megfelelo legyen neki (ebben kernek egy megerositest)

 

Ahhoz hogy ebben a formaban kapja meg az ertekeket, ahhoz szinten a manual alapjan igy kell megkapnia:

Az altalam leirt pelda datumra nezve:

%Y -- ev 4 digites formaban (2021)

%m -- honap 2 digites formaban (02)

%d -- nap 2 digites (16)

%H -- ora 2 digites 0-23 (10)

%i -- perc 2 digites 0-59 (51)

%S -- masodperc 0-59 (12)

%f  -- microsec 000000-999999 (542145)

Ebben is jo lenne egy megerosites, hogy ezt kell-e kuldenem neki egyeltalan...

 

Fogom a mysql-t letrehozom az adatbazisban a tablat, a tablaban az oszlopot(ez az egy oszlop szerepel csak benne). Beallitom a DATETIME(6)-t, es keszen is vagyok. DATETIME(4)-re pl csak 2 digites lesz a tort resz --> 10:51:12.00

 

Jojjon a python script:

Letrehozom az aktualis idot a datetime.now()-al. Probaltam igy siman a datetime formatumaval is elkuldeni, de nem ment, ezert google alapjan ez az "ujra formazott" ido formatum elvben mukodik, igy ezzel probalkoztam ez lett a formatted_date valtozo. 

now = datetime.now()

formatted_date = now.strftime('%Y-%m-d %H:%M:%S.%f') --> ez ugye a pythonban levo formatum ez nem ismeri a mysql %i formatumat

Tehat, a fenti sorral az en ertelmezesem szerint eloallitottam a szukseges datumido formatumot. Ugye?

 

Jojjon a kuldes:

A teoriam az hogy definialom a mysql-nek hogy amit kapni fog, azt hogyan kell ertelmezni --> (%Y-%m-%d %H:%i:%S.%f)

mycursor.execute(INSERT INTO proba (datum) VALUES (%Y-%m-%d %H:%i:%S.%f)", (formatted_date)) --> ezzel syntax error van

mycursor.execute(INSERT INTO proba (datum) VALUES ('%Y-%m-%d %H:%i:%S.%f')", (formatted_date)) --> ezzel syntax error van, itt '' koze tettem a datum formatum jelolot, hogy "egy adatkent kezelje", de nem jott be

mycursor.execute(INSERT INTO proba (datum) VALUES", (formatted_date)) --> ezzel is syntax error van

mycursor.execute("INSERT INTO proba (datum) VALUES (localtime)") --> ez mukodik, de ez a mysql serveren futo idot keri le

mycursor.execute("INSERT INTO proba (datum) VALUES (datetime.now())") --> ezzel access denied error-al fut hibara, gondolom ez hasonloan a localtime-hoz a mysql server idejet kerne le

 

Mindenkeppen szuksegem van a tizedes reszbol 1 vagy 2 digitre, mert 1 masodperc alatt erkezhet 2-3 jel is, es most ebben az esetben a mysql hibara fut, hogy duplicate van. Mivel ugye csak ez ez egy oszlop van a tablaba, igy ez a primary key is abbol meg ugye nem lehet ketto vagy tobb egyforma. Csak ezert hogy mondjuk egy ID oszlopot betegyek hogy lehessen 2 vagy tobb azonos datumido nem szeretnek, illetve feleslegesnek tartom. 

 

Eros a gyanum, ha jol ertem a manual-t, akkor a megoldas itt van elottem, csak nincs meg a szintaktika, hogy hogyan kuldjem el a tablaba.

 

Szerk.:

Itt a hiba uzenet, hatha valakinek segit:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%Y-%m-%d %H:%i:%S.%f)' at line 1

 

A valaszokat elore is koszonom!

SQL bénázás

Van egy lekérdezésünk, ami összeszámolja adott kliens esetén, hogy melyik státuszban hányszor volt. Így néz ki:

SELECT client_id,status,COUNT(status) FROM cli_s GROUP BY status,client_id ORDER BY client_id,status;

Ez ad egy ilyen táblázatot:

+-----------+--------+---------------+
| client_id | status | count(status) |
+-----------+--------+---------------+
|       155 |      0 |            69 |
|       155 |     10 |             8 |
|       155 |     30 |             2 |
|       155 |     40 |             2 |
|      1100 |      0 |           158 |
|      1100 |     10 |            17 |
|      1100 |     30 |            16 |
+-----------+--------+---------------+

Ez helyett szeretnék valami tömörebbet, valahogy így:

+-----------+----------+-----------+-----------+-----------+-----------+
| client_id | count(0) | count(10) | count(20) | count(30) | count(40) |
+-----------+----------+-----------+-----------+-----------+-----------+
|       155 |       69 |         8 |         0 |         2 |         2 |
|      1100 |      158 |        17 |         0 |        16 |         0 |
+-----------+----------+-----------+-----------+-----------+-----------+

Ok, awk-val pillanatok alatt össze lehet dobni az átalakítást, de talán az SQL is tud ilyet.
A status csak a 0,10,20,30,40 számok valamelyike lehet.

 

mysql timestamp vs. nyári/téli időszámítás kezdő kérdés

Nem vagyok rutinos programozás, sql és időmérés témában sem:-) Kis hobbi projektben a problémám:

Egyszerű mysql tábla, az egyik mező timestamp. Python-ból tolnék bele utc-s időbélyegeket. A tavaszi óraállításkor, mikor 2:00-ról 3:00-ra ugrunk nekem vannak utc szerint köztes időpontok is, amit ilyen formában insert-elek pl: "2016-03-27 02:17:00"

De minden ilyen 2:00-3:00 közötti érték 2016.03.27 03:00:00 -val kerül be. Ha jól gondolom, UTC-ben nem kéne óraállításnak lenni, de lehet, hogy vannak fogalomzavaraim.

Erre van valami egyszerű megoldás? Köszönöm

MySql update egyik gépen nagyon lassú

Van egy update ami több mint 2 millió rekordot változtat meg. A fejlesztői gépemen olyan lassan fut, hogy ki sem bírom várni a végét. Egy órányi futás után kilövöm. Az egyik VPS-en meg 3 perc alatt lefut ugyanazon az adatbázison. 

Holott a fejlesztői gép jóval erősebb mint a VPS. Mi lehet ennek az oka? Egyáltalán hol kezdjek el keresgélni?

MSSQL VS LOCK_TIMEOUT

Sziasztok,

Nalam biztosan sokan sokkal jobban benne vannak az MSSQL -ben, a kerdesem az volna, hogy LOCK_TIMEOUT erteket egy DB szerveren, csak egy DB -re be lehet allitani?

A default ugye az, hogy a vegtelensegig lockolva marad, de ezt csak az egyik DB -n meg kene valtoztatnom.

 

Koszi!

MySQL TRIGGER OLD/NEW

Helló!

Van két táblám. Egyszerűség kedvéért

stock(id,stock,NOW()) 
trans(id,product_id,mennyiseg);

Azt szeretném, ha bármilyen SQL művelet van a trans táblán, akkor annak utolsó rekordjának az egyik mezeje alapján a stock táblába menjen egy REPLACE ahol eltárolom a termékhez tartozó aktuális készletet. Valamiért a NEW és az OLD rohadtul nem adódik át.
Mit rontok el?


 


CREATE TRIGGER trans_update
    AFTER UPDATE ON trans
    FOR EACH ROW 
    REPLACE INTO stock SET stock = (SELECT SUM(mennyiseg) as mennyiseg FROM trans WHERE product_id = 'OLD.product_id'), id = 'OLD.product_id';

CREATE TRIGGER trans_insert
    AFTER INSERT ON trans
    FOR EACH ROW 
    REPLACE INTO stock SET stock = (SELECT SUM(mennyiseg) as mennyiseg FROM trans WHERE product_id = 'NEW.product_id'), id = 'NEW.product_id';

    
CREATE TRIGGER trans_delete
    AFTER DELETE ON trans
    FOR EACH ROW 
    REPLACE INTO stock SET stock = (SELECT SUM(mennyiseg) as mennyiseg FROM trans WHERE product_id = 'OLD.product_id'), id = 'OLD.product_id';