Ich erstelle ein Bash-Skript, das unter anderem Daten aus einer MySQL-Datenbank sammelt. Mein MySQL-Benutzer hat Schreibrechte, aber aus Sicherheitsgründen möchte ich ihn vorübergehend auf einen schreibgeschützten Zustand setzen. Ist es möglich, dies über eine Befehlszeile zu tun?Wie stelle ich MySQL über die Befehlszeile vorübergehend auf schreibgeschützt ein?
Antwort
Ihre ursprüngliche Frage zu beantworten, können Sie Ihre gesamte Datenbank setzen nur Modus zu lesen, indem diese Befehle:
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = 1;
und zurück in den normalen Modus mit:
SET GLOBAL read_only = 0;
UNLOCK TABLES;
Beachten Sie, dass dies eine Operation ist, die das Verhalten der Datenbank tiefgreifend beeinflussen wird. Bevor Sie das ausführen, lesen Sie die verfügbare Dokumentation zu den obigen Befehlen. Ein viel gebräuchlicherer Weg besteht darin, DML-Privilegien von dem bestimmten Benutzer zu widerrufen und sie anschließend zurückzugeben.
Beste Antwort, wenn die OP möchte die gesamte Datenbank im schreibgeschützten Modus setzen. Titel und aktuelle Frage sind hier verwirrend. Wie auch immer, +1 für die einfachste Lösung. – fancyPants
Um anderen eine Suche zu ersparen, hier ist, was ich gelesen habe, bevor ich mit diesen spielte: [read_only global] (https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_read_only) (enthält die Erwähnung von 'FLUSH TABLES WITH READ LOCK;') und [diese für Backups verwenden] (http://docs.oracle.com/cd/E17952_01/refman-5.5-de/replication-solutions-backups-read-only. html). – sage
Nachdem ich die obige Methode ausgeführt habe, befindet sich meine Datenbank nur noch im Lese- und Schreibmodus. – Phoenix
Nun, wenn der Benutzer jetzt alle Berechtigungen zuerst, müssen Sie es
$>mysql -u DB_USER -pDB_PASS --execute="REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'YOUR_USER';"
Danach können Sie ihn, die select-Berechtigung
$>mysql -u DB_USER -pDB_PASS --execute="GRANT SELECT ON 'YOUR_DATABASE'@.* TO 'YOUR_USER'@'%';FLUSH PRIVILEGES;"
Sie Ihre Sachen geben zu widerrufen und danach gewähren Privilegien wieder an den Benutzer
$>mysql -u DB_USER -pDB_PASS --execute="GRANT ALL ON 'YOUR_DATABASE'@.* TO 'YOUR_USER'@'%';FLUSH PRIVILEGES;"
Und das ist alles, Leute
HINWEIS: Bewertung für Quotierung, vielleicht vergessen haben, ich etwas
Wenn Sie MySQL 5.6 oder neuer und InnoDB verwenden, können Sie eine Sitzung schreibgeschützt machen.
SET SESSION TRANSACTION READ ONLY;
https://dev.mysql.com/doc/refman/5.6/en/set-transaction.html
"nur lesen" bietet auch eine bescheidene performance benefit.
Benutzer ändern, vielleicht? – Strawberry
Es gibt eine ähnliche Frage (mit einer Antwort) bei dba.sc: http://dba.stackexchange.com/questions/74670/revoke-write-privileges-vset-setting-database-to-readonly – Bass