web-dev-qa-db-fra.com

Comment définir temporairement MySQL en lecture seule via la ligne de commande?

Je crée un script bash qui, entre autres, rassemble des données à partir d'une base de données MySQL. Mon utilisateur MySQL a des privilèges d'écriture, mais pour des raisons de sécurité, je voudrais le mettre temporairement en lecture seule. Est-il possible de le faire à partir d'une ligne de commande?

30
Jimmy C

Pour répondre à votre question d'origine, vous pouvez mettre toute votre base de données en mode lecture seule par ces commandes:

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = 1;

et revenir en mode normal avec:

SET GLOBAL read_only = 0;
UNLOCK TABLES;

Attention, il s'agit d'une opération qui aura un impact profond sur le comportement de la base de données. Donc, avant d'exécuter cela, lisez la documentation disponible pour les commandes ci-dessus. Une manière beaucoup plus courante consiste à révoquer les privilèges DML de l'utilisateur spécifique et à les accorder ensuite.

50
Flo Doe

Si vous utilisez MySQL 5.6 ou plus récent et InnoDB, vous pouvez rendre une session en lecture seule.

SET SESSION TRANSACTION READ ONLY;

https://dev.mysql.com/doc/refman/5.6/en/set-transaction.html

"LIRE SEULEMENT" offre également un modeste avantage de performance .

5
txyoji

Eh bien, si l'utilisateur dispose actuellement de tous les privilèges, vous devez le révoquer

$>mysql -u DB_USER -pDB_PASS --execute="REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'YOUR_USER';"

Après cela, vous lui donnez l'autorisation de sélection

$>mysql -u DB_USER -pDB_PASS --execute="GRANT SELECT ON 'YOUR_DATABASE'@.* TO 'YOUR_USER'@'%';FLUSH PRIVILEGES;"

Faites votre travail et accordez ensuite des privilèges à l'utilisateur

$>mysql -u DB_USER -pDB_PASS --execute="GRANT ALL ON 'YOUR_DATABASE'@.* TO 'YOUR_USER'@'%';FLUSH PRIVILEGES;"

Et c'est tout le monde

REMARQUE: examen pour devis, j'ai peut-être oublié quelque chose

2
Sal00m