Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mysql Backups are only 1KB #1

Closed
Bleala opened this issue Nov 23, 2021 · 7 comments
Closed

Mysql Backups are only 1KB #1

Bleala opened this issue Nov 23, 2021 · 7 comments

Comments

@Bleala
Copy link

Bleala commented Nov 23, 2021

Hello there!

I tried the backup script for mysql/mariadb and the output files are only 1KB.
There are no errors during runtime, except

 create Backup for Database on Container:
  * /run/secrets/mariadb_database DB on mariadb_baikal
./mariadb_backup.sh: line 58: /docker/backup/database/mariadb/mariadb_baikal-/run/secrets/mariadb_database-202111231913.sql.gz: No such file or directory
mysqldump: Got error: 1045: "Access denied for user 'root'@'localhost' (using password: YES)" when trying to connect
ls: cannot access '/docker/backup/database/mariadb/mariadb_baikal*.gz': No such file or directory

But this error only happens with two different containers, there are no errors with the other containers, although i deployed them the same way, so i don't get it, why an error occurs with these two containers.

Do you have an idea what to do?

Greetings

@alaub81
Copy link
Owner

alaub81 commented Nov 23, 2021

Hello @Bleala,

i have an idea. Could you please provide me some more informations on your used mariadb docker Container?

It Looks like an Environment variable is set in an other way here. There is a path in the filename… /secrets….

@Bleala
Copy link
Author

Bleala commented Nov 23, 2021

@alaub81
Ich werd mal in Deutsch weiterschreiben, da du laut deinem Github Profil ja Deutscher zu sein scheinst :)

Das wär der MariaDB Part in meinen Compose Files (ist immer exakt 1:1 das selbe):
(SECRETSDIR Variable wird per .env Datei gesetzt)

version: "3.9"

networks:                                 
  traefik_proxy:                       
    external:
      name: traefik_proxy
  gitea:
    internal: true
  default:
    driver: bridge

volumes:
  mariadb:
    name: mariadb_gitea
    driver: local

secrets:
  mariadb_database:
    file: $SECRETSDIR/mariadb_database
  mariadb_password:
    file: $SECRETSDIR/mariadb_password
  mariadb_root_password:
    file: $SECRETSDIR/mariadb_root_password
  mariadb_user:
    file: $SECRETSDIR/mariadb_user

services:
  mariadb:
    container_name: mariadb_gitea
    image: mariadb:10.6
    restart: always
    security_opt:
      - no-new-privileges:true
    networks:
      - gitea
    environment:
      - MARIADB_DATABASE_FILE=/run/secrets/mariadb_database
      - MARIADB_PASSWORD_FILE=/run/secrets/mariadb_password
      - MARIADB_ROOT_PASSWORD_FILE=/run/secrets/mariadb_root_password
      - MARIADB_USER_FILE=/run/secrets/mariadb_user
    volumes:
      - type: bind
        source: $DOCKERDIR/mariadb/my.cnf
        target: /etc/mysql/conf.d/my.cnf
        read_only: true
      - type: volume
        source: mariadb
        target: /var/lib/mysql
        read_only: false
    secrets:
      - mariadb_database
      - mariadb_password
      - mariadb_root_password
      - mariadb_user

deshalb noch komischer, da die Fehlermeldung nur bei zwei Container auftritt, bei den anderen 8 nicht, da läuft es ohne Probleme durch.
Wobei nachdem die .sql.gz Dateien nur 1KB haben und wenn man sie extrahiert nichts drinnen ist, ist dann doch auch wo ein Problem^^

@alaub81
Copy link
Owner

alaub81 commented Nov 23, 2021

Wie hast du denn im BackupScript die Container konfiguriert? Also was steht hinter CONTAINER= ?
Er scheint deinen Datenbank Namen nicht aus den Environments lesen zu können, sicher wegen der secret files. Was passiert wenn du im DB Container env eingibst. was spuckt der hier hinter MYSQL_DATABASE aus?

@Bleala
Copy link
Author

Bleala commented Nov 23, 2021

Hinter Container steht folgendes: $(docker ps --format '{{.Names}}:{{.Image}}' | grep 'mysql\|mariadb' | cut -d":" -f1) , hab das genommen, wo dabei steht, dass alle MariaDB Container gebackupt werden.

Bei env bekomme ich folgendes raus: MYSQL_DATABASE_FILE=/run/secrets/mariadb_database

Habs auch bei einem Container getestet wo das Backup scheinbar durchläuft, da bekomm ich genau das selbe mit env, aber im Script keine Fehlermeldung.

Sind deswegen auch die Backups nur 1KB groß und ohne Inhalt?

@alaub81
Copy link
Owner

alaub81 commented Nov 24, 2021

Gibt es da auch einfach nur MYSQL_DATABASE=? Wenn nein, dann funktioniert das Script den den Secret Files nicht. Müsste ich mal nachstellen um hier eine Lösung zu finden.

Das Problem kommt auf jedenfalls hier her:
MYSQL_DATABASE=$(docker exec $i env | grep MYSQL_DATABASE |cut -d"=" -f2)
hier sollte er den Datenbank Namen auslesen, den es sichern und vor allem auch im BackupNamen verwenden soll.

Falls es den anderen Wert auch gibt, ist es denke ich damit getan es so zu fixen:
MYSQL_DATABASE=$(docker exec $i env | grep "MYSQL_DATABASE=" |cut -d"=" -f2)

@Bleala
Copy link
Author

Bleala commented Nov 27, 2021

Nein den Wert MYSQL_DATABASE= gibt es in der Form nicht, sind alle immer nur in dem Format: MYSQL_DATABASE_FILE=/run/secrets/mariadb_database.

MYSQL_DATABASE=$(docker exec $i env | grep "MYSQL_DATABASE=" |cut -d"=" -f2) funktioniert leider auch nicht, auch nicht wenn ich den Wert auf "MYSQL_DATABASE_FILE=" ändere.
Dürfte ziemlich sicher aber an den Secrets liegen, habe das Kommando mal auf mysqldump --all-databases umgebaut und da bekommt man dann auch immer die Fehlermeldung Access denied for user 'root'@'localhost' (using password: NO), also kann er auch das Passwort nicht auslesen.

Denke für Docker Secrets gibt es hier keine direkte Lösung oder?

@alaub81
Copy link
Owner

alaub81 commented Nov 27, 2021

Ich habe mal ein wenig geschaut. ich denke mit den Script von mir kommst du definitiv nicht weiter. Docker Secrets gehen hier nicht. Er braucht User und Passwort zum anmelden an die Datenbank. Und die kann er scheinbar nicht auslesen.
Aber ich werde mir das in einer ruhigen minute einmal genauer anschauen. Du kannst auf jeden Fall die Datenbanken mit Docker Secrets einfach exkludieren.

@alaub81 alaub81 closed this as completed Dec 4, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants