Dumpa databasen

Numera kör jag oftast mina databaser i docker-containrar (snart ska jag lära mig att använda podman istället). Rätt som det är har jag behov av att manuellt ta en databasbackup, och jag glömmer alltid bort från gång till gång hur man gör.

mysqldump

Kommandot jag då söker heter mysqldump eftersom jag oftast använder MariaDB eller MySQL. (Motsvarande kommando för Postgres heter pg_dump.) Det mysqldump behöver veta är vilken användare som vi ska logga in med och dess lösenord samt vilken databas som vi vill dumpa. Låt säga att vår databas heter webbsajt_db:

mysqldump --user jonarvid --password=hemligt123 webbsajt_db

(Nu ska man egentligen undvika att skriva in lösenordet i kommandoraden så där eftersom det då finns tillgängligt i klartext i kommandohistoriken. Man ska också undvika så usla lösenord som hemligt123 men mer om det en annan gång.)

Detta kommer att dumpa hela databasen i sql-format rätt ut på skärmen, men vi kan “fånga upp” denna ström av tecken till att landa i en fil istället:

mysqldump --user jonarvid --password=hemligt123 webbsajt_db > websajt_db_dump.sql

Kör kommandon i containern

Men om man har databasen snurrandes inne i en container, så behöver man in i containern och göra detta. Då använder man docker-kommandot exec, där man först får ange containerns namn - låt oss säga att den heter db-container - och vilket kommando man vill köra, det vill säga mysqldump och samma parametrar som innan:

docker exec db-container mysqldump --user jonarvid --password=hemligt123 webbsajt_db

Precis som tidigare så spottas databasdumpen ut på skärmen - men om vi lägger till ` > websajt_db_dump.sql` i slutet på raden så kommer dump-filen skapas inne i containern. Om vi då använder ett litet tricks och sätter parenteser på rätt ställen, så kommer outputen att strömmas till hosten istället:

(docker exec db-container mysqldump --user jonarvid --password=hemligt123 webbsajt_db) > websajt_db_dump.sql

Vips, så har vi dumpat från en databas inne i en container till filsystemet utanför.