Fórumok
Sziasztok,
mi a biztonsagos recept "mysql backup es restore" keszitesere docker image-ben (mysql:8.0.31) futtatott mysql adatbazisbol?
szerint:
backup: mysqldump -u root -r test.sql -p test
mysqldump -u root --flush-privileges -r mysql.sql -p mysql
restore:
mysql -u root -p
create database test;
use test;
source test.sql
use mysql;
source mysql.sql
FLUSH PRIVILEGES;
vagy pedig
b)
https://dba.stackexchange.com/questions/100511/backup-restore-users-pas…
The 'mysql' database contains users/privileges/passwords. So take the dump of mysql database along with other databases
mysqldump [options] --all-databases > all_databases_dump.sql
mysqldump -u root -p mysql user > user_table_dump.sql
These mysql database tables contain grant information
user: User accounts, global privileges, and other non-privilege columns.
db: Database-level privileges.
tables_priv: Table-level privileges.
columns_priv: Column-level privileges.
procs_priv: Stored procedure and function privileges.
After restoring cross check with
select Host, user, password from user ;
SHOW GRANTS FOR 'user'@'localhost';
Koszonom elore a segitseget.
Ardi
Hozzászólások
pont ugyanúgy, ahogy normál mysql esetén.
Domain, tárhely és webes megoldások: aWh
egy próbát megér:
https://github.com/tiredofit/docker-db-backup
Csak annyit fuznek hozza, hogy van egy kliens deploymentem 20GB pvc-vel, ahova menthetek, majd S3-be kuldhetem a mentest.
A kerdes az, hogy melyik a jo. Van valamilyen mod arra, hogy restore utan valamilyen lecsekkelest hajtok vegre, hogy rendben van a restore?
Ardi
Ebben az esetben a dump a nyerő.
Tudod csekkolni, hogy a fájl létrejött, mérete nem 0byte. Egyébként szöveges fájlról van szó, így nem tudod a tartalmát ellenőrizni.
Belőhetsz valami dockeres temp mysql-t nulláról automatizálva ahova betöltheted, utána csekkolhatod a táblákat, akkor talán kimondhatod, hogy rendben van. DB mérettől függ, hogy ez mennyi idő és megéri e.
Egyébként ha valami be is krepálna a dump-ban, akkor is valszeg kézzel összelapátolható, persze akkor már kisebb a garancia rá.
Ha business critical az app, akkor inkább jobban preferálom a managed serviceket managed backupokkal. (ha cloudról van szó).
Az egyik lehetseges modszer: https://hub.docker.com/_/mysql#creating-database-dumps
A masik, amit egyebkent hasznalok: https://hub.docker.com/r/databack/mysql-backup
De ugye ha fontos a DB, akkor van binary log(*), amit szinten menteni kell. Vagyhat nem kell, de ajanlott :)
*) Igen, en is tudok sorolni eseteket, amikor fontos, de megsincs, de szigoruan szerintem az a kivetel.
Sziasztok,
bash alatt mukodik a remote backup cliensrol.
Viszont python3 alatt a kovetkezo hibat kapom:
$ /usr/local/bin/python3 do.py
mysqldump: Got error: 2002: "Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)" when tryi
ng to connect
$ cat do.py
import subprocess
# Define database connection details
host = "mysql-service"
user = "mysqlclient"
password = "password"
database = "test"
backup_file = "/tmp/backup.sql"
# Execute the mysqldump command
command = f"/usr/bin/mysqldump −h{host} −u{user} −p{password} {database} > {backup_file}"
subprocess.run(command, shell=True)
UPDATE1:
atirva:
command = f"/usr/bin/mysqldump −u{user} −p{password} -h{host} {database} > {backup_file}"
eredmeny:
/usr/bin/python3 do.py
mysqldump: Got error: 1045: "Access denied for user 'mysqlclient'@'client_IP' (using password: NO)" when trying to con
nect
Ez jobb, de keresem tovabb a megoldast.
Koszi elore a segitseget.
Ardi
És mi történik, ha ugyanezt Python nélkül csinálod?
Milyen speciális character van a jelszóban? Mondjuk szóköz vagy kérdőjel?
Nem vagyok egy piton expert, de ez nekem gyanús:
és így?
nos, van benne $ es @ karakter, de igy van ez bash alatt is.
bash-ben pw='' es python-ban "" jelek koze zarva.
Nem ertem, miert megy bash alatt es pythonban nem...
Ardi
De amit a pythonban köré zártál, azt a python interpreter megette, a command változó értékében már nem szerepel, márpedig a shell azt kapja meg.
És ha már mindenképp kell köré a python (ennyiből én nem látom minek), és ez egy mentő script, akkor én amondó volnék, hogy csináld meg rendesen, hogy pl tudj a hibákról.
Szóval ahelyette, hogy shell=Trueval, és a stringbe belehegesztett "hova kell itt idézőjel a python és a shell között" sajtreszelővel szórakoznál, szépen add neki oda elemenként a commandot, és ne a shellel írd fájlba, hanem adj neki filehandlet, és ellenőrizd az stderr végét.
Teljesen lendületből, szóval simán lehet hibás, de valami ilyesmi
Nyilván lehetne ezt még cizellálni, külön elkapni a SubprocessErrorokat, meg az OSErrorokat (a fileműveletek miatt), meg a check helyett stderr=PIPE-al hívni a subprocesst, és a kimenetben ellenőrizni a visszatérési értéket (ezt csinálja magától a check), illetve az stderr értéket, akkor azt is ki tudod iratni, ilyesmi.
Szerk: ha így csinálod,a commandba a hosszú paraméter nevek kellenek, mert a mysqldump háklis a rövidek utáni spacere.
koszike, de erre is nyavalyog a kovetkezo hibaval:
File "/mysqlclient/app/to.py", line 13
command = ("/usr/bin/mysqldump", "-h" host, "-u", user, "-p", password, database)
^
SyntaxError: invalid syntax
Ardi
Hát javítsd meg, vmi elgepeltem gondolom. :-)
Mármint így gondolnád, ugye?
Sajnos ez biztonsági szempontból lyukas, gonosz haxor meg tudja törni. Ilyesmi lenne a precíz megoldás: https://lzsiga.users.sourceforge.net/ekezet.html#Q0104
mert nem vetted észre, hogy az egy úgynevezett f-string, nem sima idézőjellel, hanem f" -el kezdődik, ilyenkor van a belsejében variable interpretation, lehet bele format stringeket írni. ;)
azt hiszem, mashol a hiba, mert amikor specialis karakterek nelkuli jelszot hasznalok,ujra ott a hiba python alatt.
mysqldump: Got error: 1045: "Access denied for user 'mysqlclient'@'client_IP' (using password: NO)" when trying to con
nect
Ardi
Egyébként az lehet, hogy a hup, de furcsa kötőjelek vannak a kódsinpletben, az eredetiben minden paraméter, az updateltben a "-u" és a "-p" szar, a "-h" jó, az kb konzisztensnek tűnik azzal, mintha nem látná a paramétert.
Igazad van, kroozo, javitva igy nez ki a sor:
command = f"/usr/bin/mysqldump -u{user} -p{password} -h{host} {database} > {backup_file}"
Ez meg ezt eredmenyezi:
mysqldump: Got error: 1045: "Access denied for user 'mysqlclient'@'clint_IP' (using password: YES)" when trying to connect
Ardi
Mindenkitol bocsanatot kerek.
Azt hiszem, kihagytam a --databases szot a pythonos szkriptbol es valahogy sikerult osszekutyulnom a jelszavat.
De ujrageneraltam es proba utan - voila:
$ cat do.py
import subprocess
from urllib import parse
# Define database connection details
host = 'mysql-service'
user = 'mysqlclient'
password = 'jelszavam'
database = 'test'
backup_file = '/tmp/backup.sql'
# Execute the mysqldump command
command = f"/usr/bin/mysqldump -u{user} -p{password} -h{host} --databases {database} > {backup_file}"
subprocess.run(command, shell=True)
$ /usr/bin/python3 do.py
-rw-r--r-- 1 mysqlclient 1000 1477 Dec 12 13:01 backup_2023-12-12-13h-01m-01s.sql #<--bash-ben generalva
-rw-r--r-- 1 mysqlclient 1000 1477 Dec 12 13:03 backup.sql #<--pythonnal generalva
diff /tmp/backup.sql /tmp/backup_2023-12-12-13h-01m-01s.sql
35c35
< -- Dump completed on 2023-12-12 13:03:23
---
> -- Dump completed on 2023-12-12 13:01:01
Koszonom mindenki hozzaszolasat.
Ardi
Sosem a gep a hulye.