Sto creando uno script bash che, tra le altre cose, raccoglie alcuni dati da un database MySQL. Il mio utente MySQL ha i privilegi di scrittura, ma per ragioni di sicurezza vorrei impostarlo temporaneamente in uno stato di sola lettura. È possibile farlo da una riga di comando?Come si imposta MySQL temporaneamente in sola lettura tramite la riga di comando?
risposta
Per rispondere alla tua domanda iniziale, si può mettere tutta la vostra base di dati modalità di sola lettura da questo comanda:
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = 1;
e torna alla modalità normale con:
SET GLOBAL read_only = 0;
UNLOCK TABLES;
Fare attenzione che si tratta di un'operazione che avrà un impatto profondo sul comportamento del database. Quindi, prima di eseguire questo, leggere la documentazione disponibile per i comandi sopra. Un modo molto più comune è di revocare i privilegi DML da un utente specifico e successivamente restituirli.
La migliore risposta, se il OP vuole davvero impostare l'intero database in modalità di sola lettura. Il titolo e la domanda attuale sono confusi qui. Ad ogni modo, +1 per la soluzione più semplice. – fancyPants
Per salvare altri utenti, ecco cosa ho letto prima di giocare con questi: [read_only global] (https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_read_only) (include la menzione di "TAVOLI FLUSH CON LETTURA BLOCCA;') e [utilizzo di questi per i backup] (http://docs.oracle.com/cd/E17952_01/refman-5.5-en/replication-solutions-backups-read-only. html). – sage
Dopo aver eseguito il metodo precedente, il mio database è ancora in modalità di lettura + scrittura. – Phoenix
Beh, se l'utente ha in questo momento tutti i privilegi prima, è necessario revocarla
$>mysql -u DB_USER -pDB_PASS --execute="REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'YOUR_USER';"
Dopo che gli dai, l'autorizzazione Select
$>mysql -u DB_USER -pDB_PASS --execute="GRANT SELECT ON 'YOUR_DATABASE'@.* TO 'YOUR_USER'@'%';FLUSH PRIVILEGES;"
Fate la vostra roba e dopo che concedere i privilegi di nuovo per l'utente
$>mysql -u DB_USER -pDB_PASS --execute="GRANT ALL ON 'YOUR_DATABASE'@.* TO 'YOUR_USER'@'%';FLUSH PRIVILEGES;"
E questo è tutto gente
NOTA: Review per la citazione, forse ho dimenticato qualcosa
Se si utilizza MySQL 5.6 o successivo e InnoDB, è possibile effettuare una sessione di sola lettura.
SET SESSION TRANSACTION READ ONLY;
https://dev.mysql.com/doc/refman/5.6/en/set-transaction.html
"Sola lettura" offre anche un modesto performance benefit.
Cambia utente, forse? – Strawberry
C'è una domanda simile (con una risposta) a dba.sc: http://dba.stackexchange.com/questions/74670/revoke-write-privileges-vs-setting-database-to-readonly – Bass