# 7. Configurer une BDD

# Postgres

# Installer PostgreSQL

PostgreSQL est un système de gestion de base de données relationnelle et objet. C'est un outil libre disponible selon les termes d'une licence de type BSD. Ce système est concurrent d'autres systèmes de gestion de base de données, qu'ils soient libres, ou propriétaires tel que Oracle.

### Installation de PostgreSQL

```shell
# Importation du repository 
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Importation des clés signé 
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
OK
# Installation version 14 de PostgreSQL
apt-get install postgresql-common postgresql-14 postgresql-contrib-14 postgresql-doc-14
# Vérifie que le service PostgreSQL fonctionne correctement
sudo service postgresql status 
```

##### Changer le mot de passe administrateur

Maintenant il faut mettre un mot de passe pour l’utilisateur admin de Postgres.

```shell
# On se connecte sur l'utilisateur postgres
sudo su - postgres 
# On affecte un mot de passe 
psql -c "alter user postgres with password 'StrongDBPasswordUser'"
ALTER ROLE
```

### Se connecter sur PSQL

Pour accéder au terminal PSQL qui permet d’administrer les bases de données sur PostgreSQL il suffit de se connecter sur l’utilisateur postgres et d'exécuter la commande psql.

```shell
> sudo su - postgres
> psql
psql (14.1 (Debian 14.1-1.pgdg110+1))
Saisissez « help » pour l'aide.

postgres=#
```

# Processus de création d'une BDD

### 1) Créer une BDD

```SQL
CREATE DATABASE <dbname>;
```

Sortie :

```SQL
postgres=# CREATE DATABASE exempledb;
CREATE DATABASE
```

### 2) Créer un utilisateur pour cette BDD

Il est préférable d'avoir un utilisateur par base donnée.

```SQL
CREATE USER <username> WITH ENCRYPTED PASSWORD 'yourpass';
```

Sortie :

```SQL
postgres=# CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypass';
CREATE ROLE
```

### 3) Donner tous les droits sur la BDD

Une fois l'utilisateur et la base de donnée créé, pour que celui-ci puisse la manager il est nécessaire de donner des droits au nouvel utilisateur.

```SQL
GRANT ALL PRIVILEGES ON DATABASE <dbname> TO <username>;
```

Sortie :

```SQL
postgres=# GRANT ALL PRIVILEGES ON DATABASE exempledb TO myuser;
GRANT
```

### 4) Donner les droits de connexion

```SQL
postgres=# GRANT CONNECT ON DATABASE exempledb TO myuser;
GRANT
```

### 5) Modifier le propriétaire

Modifier le propriétaire de la BDD pour mettre notre utilisateur récemment créé :

```sql
ALTER DATABASE db_name OWNER TO new_owner_name;
```

### 56) Se connecter sur la nouvelle BDD

```SQL
 psql -U <username> -d <dbname>
```

# Le terminal PSQL

> **<span class="application">psql</span>** — terminal interactif <span class="productname">PostgreSQL</span>

### Accéder à PSQL

Il existe différente façon d'accéder au terminal interactif de PostgreSQL.

Pour se connecter avec un utilisateur et son mot de passe :

```shell
psql -U <username> -W
```

##### Liste des options PSQL

<table border="1" id="bkmrk-option-psql-descript" style="border-collapse: collapse; width: 100%; height: 373.015px;"><tbody><tr style="height: 29.7969px;"><td class="align-center" style="width: 50.0618%; height: 29.7969px;">**Option PSQL**</td><td class="align-center" style="width: 50.0618%; height: 29.7969px;">**Description** </td></tr><tr style="height: 30.1094px;"><td style="width: 50.0618%; height: 30.1094px;">-U `username`</td><td style="width: 50.0618%; height: 30.1094px;">Se connecte à la base de données en tant que l'utilisateur</td></tr><tr style="height: 46.5938px;"><td style="width: 50.0618%; height: 46.5938px;">-W</td><td style="width: 50.0618%; height: 46.5938px;">Force <span class="application">psql</span> à demander un mot de passe avant de se connecter à une base de données</td></tr><tr style="height: 35.3906px;"><td style="width: 50.0618%; height: 35.3906px;">-d `dbname`</td><td style="width: 50.0618%; height: 35.3906px;">Indique le nom de la base de données où se connecter

</td></tr><tr style="height: 57.7812px;"><td style="width: 50.0618%; height: 57.7812px;">-h `host`</td><td style="width: 50.0618%; height: 57.7812px;">Indique le nom d'hôte de la machine sur lequel le serveur est en cours d'exécution. (Pour se connecter à distance)

</td></tr><tr style="height: 57.7812px;"><td style="width: 50.0618%; height: 57.7812px;">-p `port`</td><td style="width: 50.0618%; height: 57.7812px;">Indique le port TCP a utiliser pour la connexion (par défaut: 5432)

</td></tr><tr style="height: 57.7812px;"><td style="width: 50.0618%; height: 57.7812px;">-o *`nomfichier`*</td><td style="width: 50.0618%; height: 57.7812px;">Dirige tous les affichages de requêtes dans le fichier *`nomfichier`*.

</td></tr><tr style="height: 57.7812px;"><td style="width: 50.0618%; height: 57.7812px;">-L *`nomfichier`*</td><td style="width: 50.0618%; height: 57.7812px;">Écrit tous les résultats des requêtes dans le fichier *`nomfichier`*

</td></tr></tbody></table>

### Liste des commandes PSQL

L'invite devient `-#` (pour le super utilisateur) ou `->` (pour l'utilisateur normal) pour la poursuite de la commande.

<table border="1" id="bkmrk-commande-psql-descri" style="border-collapse: collapse; width: 100%; height: 279.672px;"><tbody><tr style="height: 29.7969px;"><td class="align-center" style="width: 49.9383%; height: 29.7969px;">**Commande PSQL**</td><td class="align-center" style="width: 49.9383%; height: 29.7969px;">**Description** </td></tr><tr style="height: 35.3906px;"><td style="width: 49.9383%; height: 35.3906px;">\\?</td><td style="width: 49.9383%; height: 35.3906px;">Pour les aides sur les commandes PSQL

</td></tr><tr style="height: 29.7969px;"><td style="width: 49.9383%; height: 29.7969px;">\\h</td><td style="width: 49.9383%; height: 29.7969px;">Pour les aides sur les commandes SQL</td></tr><tr style="height: 29.7969px;"><td style="width: 49.9383%; height: 29.7969px;">\\du</td><td style="width: 49.9383%; height: 29.7969px;">Liste des utilisateurs</td></tr><tr style="height: 29.7969px;"><td style="width: 49.9383%; height: 29.7969px;">\\q</td><td style="width: 49.9383%; height: 29.7969px;">Pour quitter PSQL</td></tr><tr style="height: 29.7969px;"><td style="width: 49.9383%; height: 29.7969px;">\\l</td><td style="width: 49.9383%; height: 29.7969px;">Lister les base de données</td></tr><tr style="height: 35.3906px;"><td style="width: 49.9383%; height: 35.3906px;">\\d</td><td style="width: 49.9383%; height: 35.3906px;">Affiche toutes les tables, indexes, vues et séquences

</td></tr><tr style="height: 29.7969px;"><td style="width: 49.9383%; height: 29.7969px;">\\dt </td><td style="width: 49.9383%; height: 29.7969px;">Affiche toutes les tables</td></tr><tr style="height: 30.1094px;"><td style="width: 49.9383%; height: 30.1094px;">\\c `dbname` `[username]`</td><td style="width: 49.9383%; height: 30.1094px;">Pour se connecter à une base de donnée avec en option un utilisateur</td></tr></tbody></table>

# Gérer les utilisateurs

### Se connecter à PostgreSQL

```shell
psql -h localhost -p 5432 -U <username> -W
```

Il est possible que la commande psql vous sorte une erreur de type : `commande inconnue`.

Dans ce cas vous allez devoir vous connecter sur l'utilisateur Linux possédant les droits d'utilisation de la commande psql.

```shell
su - postgres
```

### Lister les utilisateurs 

Dans l'interface de psql :

```SQL
\du
```

### Créer un utilisateur

Il existe deux commandes différentes pour réaliser cette action.

```SQL
CREATE USER <username>;
```

ou

```SQL
CREATE ROLE <username> WITH LOGIN;
```

#### Créer un utilisateur avec l'utilitaire

La création interactive d'un utilisateur est une option pratique disponible uniquement pour l'utilitaire client. Pour créer un utilisateur de manière interactive, exécutez la commande suivante :

```shell
sudo -u postgres createuser --interactive
```

####   


#### Créer un super utilisateur

<p class="callout danger">Un super utilisateur de base de données contourne toutes les vérifications, ce qui est dangereux du point de vue de la sécurité. Utilisez cette action avec précaution et évitez de travailler avec un compte super utilisateur sauf en cas de nécessité absolue.</p>

Sur PostgreSQL le "super user" est `postgres` mais dans certain cas il est possible de vouloir créer son propre super user.

Pour créer un super utilisateur :

```SQL
CREATE USER <username> SUPERUSER;
```

Si cet utilisateur doit avoir un mot de passe :

```SQL
CREATE USER <username> WITH SUPERUSER PASSWORD 'passwordstring';
```

##### Mot de passe

Dans le cas ou vous avez créé un utilisateur sans mot de passe il possible de lui rajouter le mot de passe via la commande suivante.

```SQL
ALTER USER <username> WITH PASSWORD '<password>';
```

#### Créer un utilisateur avec des droits

```SQL
CREATE USER <name> WITH <option>;
```

<table border="1" id="bkmrk-option-syntax-psql-e" style="border-collapse: collapse; width: 100%;"><tbody><tr><th class="has-text-align-center" data-align="center" style="width: 33.3745%;">**Option Syntax**</th><th class="has-text-align-center" data-align="center" style="width: 33.3745%;">**PSQL**</th><th style="width: 33.3745%;">**Explanation**</th></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-s`**  
**`--superuser`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`SUPERUSER`**</td><td style="width: 33.3745%;">Add the superuser privilege.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-S`**  
**`--no-superuser`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOSUPERUSER`**</td><td style="width: 33.3745%;">No superuser privilege (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-d`**  
**`--createdb`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`CREATEDB`**</td><td style="width: 33.3745%;">Allows the user to create databases.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-D`**  
**`--no-createdb`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOCREATEDB`**</td><td style="width: 33.3745%;">Not allowed to create databases (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-r`**  
**`--createrole`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`CREATEROLE`**</td><td style="width: 33.3745%;">Allows the user to make new roles.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-R`**  
**`--no-createrole`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOCREATEROLE`**</td><td style="width: 33.3745%;">Not allowed to create roles (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-i`**  
**`--inherit`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`INHERIT`**</td><td style="width: 33.3745%;">Automatically inherit the privileges of roles (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-I`**  
**`--no-inherit`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOINHERIT`**</td><td style="width: 33.3745%;">Do not inherit privileges of roles.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-l`**  
**`--login`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`LOGIN`**</td><td style="width: 33.3745%;">Allows the user to log into a session with the role name (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-L`**  
**`--no-login`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOLOGIN`**</td><td style="width: 33.3745%;">Not allowed to log into a session with the role name.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`--replication`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`REPLICATION`**</td><td style="width: 33.3745%;">Allows initiating streaming replication and activating/deactivating backup mode.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`--no-replication`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`NOREPLICATION`**</td><td style="width: 33.3745%;">Not allowed to initiate streaming replication or backup mode (default).</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-P`**  
**`--pwprompt`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`PASSWORD '<password>'`**</td><td style="width: 33.3745%;">Initiates password creation prompt or adds provided password to the user. Avoid using this option to create a passwordless user.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">/</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`PASSWORD NULL`**</td><td style="width: 33.3745%;">Specifically sets the password to null. Every password authentication fails for this user.</td></tr><tr><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`-c <number>`**  
**`--connection-limit=<number>`**</td><td class="has-text-align-center" data-align="center" style="width: 33.3745%;">**`CONNECTION LIMIT <number>`**</td><td style="width: 33.3745%;">Sets the maximum number of connections for user. Default is without limit.</td></tr></tbody></table>

### Changer les droits d'un utilisateur

Par exemple pour donner les droits de création d'une base de donnée a un utilisateur :

```SQL
ALTER USER <username> CREATEDB;
```

Dans le même ordre d'idée on peux donner les droits super utilisateur :

```SQL
ALTER USER <username> WITH SUPERUSER;
```

Mais aussi les enlever :

```SQL
ALTER USER <username> WITH NOSUPERUSER;
```

### Changer le mot de passe d'un utilisateur

```sql
ALTER USER user_name WITH PASSWORD 'new_password';
```

### Supprimer un utilisateur

```SQL
DROP USER [IF EXISTS] <username>;
```

Si l'utilisateur que vous essayez de supprimer possède des dépendances, la suppression échouera.

Vous allez devoir transférer les dépendances a un autre utilisateur.

1\) Par exemple, pour transférer les objets appartenant à myuser à postgres, exécutez :

```SQL
REASSIGN OWNED BY <old_user> TO <new_user>;
```

 2) Supprimer les connexions de l'objet de la base de données à l'utilisateur avec :

```SQL
DROP OWNED BY <username>;
```

3\) Maintenant vous pouvez supprimer l'utilisateur

### Supprimer un rôle 

```SQL
DROP ROLE [IF EXISTS] <name>;
```

### Donner l'accès à une BDD à un utilisateur

```SQL
GRANT ALL PRIVILEGES ON DATABASE <db_name> TO <username>;
```

# Sauvegarder une BDD

### Réaliser une sauvegarde d'une BDD

Pour créer une sauvegarde (**backup** en Anglais) de la base de données sur PostgreSQL c’est très simple car il existe un utilitaire `pg_dump` pour créer une sauvegarde même si la base données est en cours d’utilisation.

Les sauvegardes peuvent être produits dans des formats de script ou de fichier d'archive. elles sont constitué des fichiers en texte clair contenant les commandes SQL nécessaires pour reconstruire la base de données dans l'état où elle se trouvait au moment où elle a été enregistrée.

Tout d’abord nous allons créer un répertoire de sauvegarde pour centraliser les sauvegarde de base de données. Puis nous allons créer une sauvegarde pour vérifier que tout fonctionne. Ensuite nous allons créer un script de sauvegarde de BDD qui s’exécutera périodiquement.

#####   


##### Création du répertoire des sauvegardes

```shell
sudo mkdir -p /var/backup
```

##### Créer une sauvegarde

<span class="hljs-comment">Commande pour créer une sauvegarde. </span><span class="hljs-comment">Remplacer les variables par les bonnes valeur avant de l'exécuter.</span>

<table border="1" id="bkmrk-%24%7Bdb_user%7D-utilisate" style="border-collapse: collapse; width: 100%; height: 119.188px;"><tbody><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_USER}**</span></td><td style="width: 79.11%; height: 29.7969px;">Utilisateur ayant accès a la base de données</td></tr><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_PASSWORD}**</span></td><td style="width: 79.11%; height: 29.7969px;">Mot de passe de l'utilisateur</td></tr><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_HOST}**</span></td><td style="width: 79.11%; height: 29.7969px;">Host de la base de données : Adresse IP ou nom de domaine</td></tr><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_NAME}**</span></td><td style="width: 79.11%; height: 29.7969px;">Nom de la base de données</td></tr></tbody></table>

```shell
/usr/bin/pg_dump postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME} | gzip -c > /var/backup/"${DB_NAME}-`date +%d-%m-%y_%T`".sql.gz;
```

Le fichier générer sera sous le nom suivant : <span class="hljs-comment">**${DB\_NAME}-${DATE}\_${HEURE}.sql.gz** </span>

### Automatiser la sauvegarde

Le processus de remplacement des variables pour réaliser une sauvegarde peut-être long et fatiguant. Il est serait plus pratique de créer un script regroupant les démarches précédentes.

##### Création du script

```shell
sudo nano save-database
```

##### Contenu du script 

```shell
#!/bin/bash

# # # # # # # # # # # # # # #
# SAVE DATABASE by gpatruno #
# # # # # # # # # # # # # # #

# définition des variables
backupdir='/etc/backup';
datefolder=`date +%m-%y`;
datescript=`date +%d-%m-%y_%T`;
DB_USER=postgres
DB_NAME=dbname
DB_PASSWORD=dbpassword
DB_HOST=localhost

echo "Répertoire de destination : $backupdir/$datefolder"
mkdir -p $backupdir/$datefolder;

echo  "PostgreSQL Backup for database : ${DB_NAME} start at " `date +%T`;
echo  "Exporting ${DB_NAME}";

# Pour conserver la version non compressé du fichier 'gzip -c fichier-de-sortie.ext > fichier-de-sortie.ext.gz'
# Sinon  compresse le fichier fichier-de-sortie et la remplace par la version compressé nommé avec l’extention *.gz 'gzip fichier-de-sortie.ext.gz'
echo "/usr/bin/pg_dump postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME} | gzip -c > $backupdir/$datefolder/"${DB_NAME}-$datescript".sql.gz;"
/usr/bin/pg_dump postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME} | gzip -c > $backupdir/$datefolder/"${DB_NAME}-$datescript".sql.gz;

echo  "done";
echo `date +%d-%m-%y`" "`date +%T`;
```

##### Donner le droit d'exécution

```shell
sudo chmod +x save-database
```

##### Exécuter le script

```shell
./save-database
```

L'exécution du script donne la sortie suivante :

```shell
Répertoire de destination : /var/backup
PostgreSQL Backup for database : dbname start at  16:38:07
Exporting dbname 
/usr/bin/pg_dump postgresql://postgres:dbpassword@localhost/dbname | gzip -c > /etc/backup/dbname-03-12-21_16:38:07.sql.gz;
done
03-12-21 16:38:07
```

### Exécution régulière

Afin de mettre en place une exécution régulière du script nous allons utiliser l'outil Linux appelé `Cron`. C'est un programme disponible sur les systèmes de type Unix (Linux, Mac Osx ...) permettant de planifier des taches régulières.

##### Ouvrir Crontab

```shell
crontab -e
```

##### Mettre le contenu suivant 

```shell
# Exécution du script tous les jours à 2h du matin
0 2 * * * /bin/sh /script/save-database
```

La tâche `Cron` ci-dessus sera exécutée tous les jours à 2 heures du matin et lancera un script `save-database` avec l'interpréteur `bash`. Ceci maintiendra la sauvegarde chaque jour.

# Restaurer une BDD

### Restaurer une sauvegarde

Nous allons créer un script de restauration afin d'éviter de répéter les commandes.

Dans le même dossier que pour le script de sauvegarde nous allons créer un script **restore-database** avec en paramètre le nom du fichier de sauvegarde a utiliser.

##### Création du script

```shell
sudo nano restore-database
```

##### Contenu du script

```shell
#!/bin/bash

# # # # # # # # # # # # # # # # #
# RESTORE DATABASE by gpatruno  #
# # # # # # # # # # # # # # # # #

# Récupération de l'emplacement du fichier de sauvegarde
read -p "Emplacement du fichier de sauvegarde : " BACKUPDIR
# Récupération du nom du fichier de sauvegarde
read -p "Nom du fichier de sauvegarde : " FILENAME

# définition des variables
SCRIPTNAME="${FILENAME/.gz/""}";
DB_USER=postgres
DB_NAME=dbname
DB_PASSWORD=dbpassword

# RESTORE
echo `date +%d-%m-%y`" "`date +%T`;

# Dézip de la sauvegarde
echo "Unzip $BACKUPDIR/$FILENAME";
gunzip -c $BACKUPDIR/$FILENAME > $SCRIPTNAME

# Déconnecter tous les utilisateurs
echo "Disconnect all users from the db";
/usr/bin/psql postgresql://${DB_USER}:${DB_PASSWORD}@localhost/${DB_NAME} -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$DB_NAME' AND pid <> pg_backend_pid();"

# Supprimer l'ancienne database si elle existe
echo "DROP DATABASE $DATABASE";
/usr/bin/psql postgresql://${DB_USER}:${DB_PASSWORD}@localhost -c "DROP DATABASE \"$DB_NAME\";"

# Créer la nouvelle Base de données
echo "CREATE DATABASE $DB_NAME";
/usr/bin/psql postgresql://${DB_USER}:${DB_PASSWORD}@localhost -c "CREATE DATABASE \"$DB_NAME\";"

# Restauration de la nouvelle BDD
echo "RESTORE DATABASE $SCRIPTNAME";
/usr/bin/psql postgresql://${DB_USER}:${DB_PASSWORD}@localhost/${DB_NAME} -f $SCRIPTNAME

echo `date +%d-%m-%y`" "`date +%T`;
```

##### Donner le droit d'exécution

```shell
sudo chmod +x restore-database
```

Puis exécuter le script et remplir les paramètres demandé au fur-à-mesures de l'avancement.

# MariaDB

# Se connecter dans MYSQL

Se connecter dans MYSQL

```bash
# Se connecter sans sélectionner de database
mysql -u <user> -p <password>

# Se connecter a une database sans préciser l'utilisateur
mysql -U <database> -p <password>

# Se connecter a une database avec un utilisateur en particulier
mysql -u <user> -U <database> -p
```

##### MySQL show database

```sql
SHOW DATABASES;
```

MySQL show user

```sql
SELECT user, host FROM mysql.user;
```

MySQL user privilège

```sql
SELECT * FROM information_schema.user_privileges;
```

MySQL add user privilège

```sql
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON <db_name>.* TO '<user>'@'<host>';
```

Exemple

```sql
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON bookstack.* TO 'userbook'@'localhost';
```

Mariadb

# Faire une sauvegarde MariaDB

`mysqldump` effectue une sauvegarde logique. C'est la manière la plus flexible d'effectuer une sauvegarde et une restauration, et un bon choix lorsque la taille des données est relativement petite.

Pour les grands ensembles de données, le fichier de sauvegarde peut être volumineux, et le temps de restauration long.

mysqldump décharge les données au format SQL (il peut également décharger dans d'autres formats, tels que CSV ou XML) qui peuvent ensuite être facilement importés dans une autre base de données. Les données peuvent être importées dans d'autres versions de MariaDB, MySQL, ou même dans un autre SGBD, à condition que le dump ne contienne pas d'instructions spécifiques à la version ou au SGBD.

mysqldump vide les triggers en même temps que les tables, car ils font partie de la définition de la table. Cependant, les procédures stockées, les vues, et les événements ne le sont pas, et nécessitent des paramètres supplémentaires pour être recréés explicitement (par exemple, --routines et --events). Les procédures et les fonctions font toutefois également partie des tables du système (par exemple mysql.proc).

#### Sauvegarder une base de donnée

```bash
# Pour faire une sauvegarde de toutes les bdd mariaDB
mysqldump -u<user> -p<password> --all-databases > mariadb-dump-$(date +%F_%H-%M-%S).sql
 
# Pour sauvegarder une bdd en particulier
mysqldump -u<user> -p<password> --databases <database> > mariadb-dump-$(date +%F_%H-%M-%S).sql
# Une autre syntaxe équivalente 
mysqldump --user="<user>" --password="<password>" --databases <database> > mariadb-dump-$(date +%F_%H-%M-%S).sql
```