MySQL 8.0.22: "Veränderung ist das, was die Leute am meisten fürchten."¹

MySQL_8022

 Am 19. Oktober 2020 wurde das MySQL Realase 8.0.22. veröffentlicht. Neben diversen Problembehebungen (Bug Fixes) haben es auch einige Neuerungen in das Relase geschaffft (vergl. https://mysqlrelease.com/2020/10/announcing-mysql-server-8-0-22-5-7-32-and-5-6-50/). Wir wollen uns an dieser Stelle mit der Funktion des "Read Only Schema" beschäftigen.

"ALTER", die Zeit für Veränderungen ist vorbei.

Bislang konnte man nur den gesamten Server (und damit alle Datenbanken) vor schreibenden Zugriffen schützen. Dazu konnte die globale Variable "read_only" auch zur Laufzeit (dynamisch) genutzt werden.
mysql> set global read_only=true;
Query OK, 0 rows affected (0.00 sec) 
mysql> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | ON    |
+---------------+-------+
1 row in set (0.02 sec) 

Diese Einstellung wird beispielsweise gerne auf Replikaten (Slave-Datenbanken) genutzt, um die Replikation vor logischen Inkonsistenzen (durch schreibende Zugriffe) zu schützen. Mit dem aktuellen Release können nun auch Schreibrechte auf Schema-Ebene (Datenbank-Ebene) einfach beschränkt werden. 

Dazu wurde das ALTER SCHEMA Statement um eine weitere Klausel ergänzt.

# als User 'root'@'localhost'
mysql> create database ORDIX;
Query OK, 1 row affected (0.00 sec)

mysql> create user 'ordix'@'localhost' identified by 'geheim';
Query OK, 0 rows affected (0.02 sec) 

mysql> grant all on ORDIX.* to 'ordix'@'localhost';
Query OK, 0 rows affected, 1 warning (0.01 sec)

# als User 'ordix'@'localhost'
bash> mysql -uordix -pgeheim -DORDIX --execute="create table ORDIX.test ( id int primary key auto_increment, wert varchar(200) )";
bash> mysql -uordix -pgeheim -DORDIX --execute="insert into ORDIX.test values (null, 'Wert 1')";
bash> mysql -uordix -pgeheim -DORDIX --execute="select * from ORDIX.test";
+----+--------+
| id | wert   |
+----+--------+
|  1 | Wert 1 |
+----+--------+
Query OK, 1 row affected (0.01 sec) 

# als User 'root'@'localhost'
mysql> alter schema ORDIX read only = 1;
Query OK, 1 row affected (0.01 sec)

# als User 'ordix'@'localhost'
mysql -uordix -pgeheim -DORDIX --execute="insert into ORDIX.test values (null, 'Wert 2')";
ERROR 3989 (HY000) at line 1: Schema 'ORDIX' is in read only mode. 

Immer schön den Überblick behalten

Ob und welche Schemata beschränkt sind, kann in den Metadaten (information_schema) eingesehen werden. Das folgende SELECT liefert eine Übersicht über die vorhandenen SCHEMATA inklusive ggfs. bestehender Einschränkungen:
mysql> select * from SCHEMATA_EXTENSIONS;
+--------------+--------------------+-------------+
| CATALOG_NAME | SCHEMA_NAME        | OPTIONS     |
+--------------+--------------------+-------------+
| def          | mysql              |             |
| def          | information_schema |             |
| def          | performance_schema |             |
| def          | sys                |             |
| def          | ORDIX              | READ ONLY=1 |
+--------------+--------------------+-------------+
5 rows in set (0.01 sec) 

Fazit: Vertrauen ist gut, Kontrolle ist besser

Ein kleines aber sehr nützliches Feature, was in einigen Betriebsfällen für mehr Sicherheit und/oder Betriebsstabilität führen kann. Besonders erfreulich ist die Tatsache, dass der Schutz der Schemata für alle User (auch mit dem SUPER-Privileg; z.B.: 'root'@'localhost') gilt. Bei der globalen Einstellung "read_only=1" sind exakt diese User von dieser Einschränkung ausgenommen. Und Manchmal sind es exakt diese Accounts, die den größten Schaden verursachen ;-)


Sie haben Fragen rund um den Betrieb von MySQL? Sprechen Sie mit uns oder besuchen Sie unseren Kurs.



¹ Fjodor Michailowitsch Dostojewski (1821 - 1881)

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/