mysql docker image - backup es restore

Fórumok

Sziasztok,

mi a biztonsagos recept "mysql backup es restore" keszitesere docker image-ben (mysql:8.0.31) futtatott mysql adatbazisbol?

a) MySQL – copying a database, users and privileges between two servers – IT Integrated Business Solutions (it-iss.com)

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

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ó).

Szerkesztve: 2023. 12. 12., k – 06:37

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

Nem vagyok egy piton expert, de ez nekem gyanús:

>>>> password = "password"
>>>> print {password}
set(['password'])
>>>> print password
password
>>>> c="sfdsf {password}"
>>>> print c
sfdsf {password}
>>>> password = "jelszo"
>>>> c = "sdfsdf {password}"
>>>> print c
sdfsdf {password}
>>>> print password
jelszo

É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

import subprocess

# Define database connection details
host = "mysql-service"
user = "mysqlclient"
password = "password"
database = "test"
backup_file_path = "/tmp/backup.sql"

# Execute the mysqldump command
try:
    with open(backup_file_path, "w") as backup_file:
        command = ("/usr/bin/mysqldump", "-h" host, "-u", user, "-p", password, database)
        subprocess.run(command, stdout=backup_file, check=True)
except:
    print(f"Valami baj volt!")

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

Mármint így gondolnád, ugye?

>>> user='U ser'
>>> pwd='a$b'
>>> cmd=f"mysqldump -u'{user}' -p'{pwd}'"
>>> print(cmd)
mysqldump -u'U ser' -p'a$b'

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. ;)

>>> password = "jelszo"
>>> c = "sdfsdf {password}"
>>> cf = f"sdfsdf {password}"
>>> print(c)
sdfsdf {password}
>>> print(cf)
sdfsdf jelszo
>>>

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