Upgrade MariaDB 5.5 na MariaDB 10.5 (s podporou JSON) na CentOS 7

Proč upgradovat na verzi 10 ? Protože od verze 10 je v mariadb podporován formát JSON, který používám pro REST API. Příklad: Mám nějaký request na API a očekávám, že mi endpoint vrátí data v JSON formátu. MariaDB 5.5 (a také MySQL 5.5) to neumí, ale desítka už ano ! Proč bych měl formátovat response endpointu API z dat vytažených z databáze, když to můžu rovnou udělat na úrovni databáze, např. procedurou.

yum install MariaDB-server

Instalátor sám nabídne, že provede upgrade 3 balíčků (client, server, common) a přidá ostatní závislosti, starou verzi jsem nemusel ručně odinstalovat.

Po instalaci balíčků jsem restartoval službu mariadb.service přes systemctl…

Po restartu služby mě PHP skripty hlásily chybu „Column count of mysql.proc is wrong“, i když se v dokumentaci https://mariadb.com/kb/en/upgrading/ píše, že nejsou žádné nekompatibilní změny verzí 5 a 10. Díky vyhledávači Google jsem našel řešení na stackoverflow.com, které jsem v dokumentaci nenašel. Bylo potřeba spustit skript „mariadb-upgrade“ uživatelem root (admin účtem).

mariadb-upgrade -uroot -p

Skript prošel všechny databázi a nastavil správně počet sloupců nebo co to bylo za chybu, už nevím přesně. A tadá, mám MariaDB 10.5.

Úprava /etc/my.cnf

Do konfigurace serveru jsem musel přidat řádek

sql-mode=""

neboť mi přestalo fungovat vkládání dat do tabulek, kde nebyla nastavena DEFAULT VALUE a zároveň měl sloupec nastaveno NOT NULL. Mariadb 10 asi ve výchozím nastavení používá sql mod „STRICT_TRANS_TABLES“, který brání vkládání např. prázdného stringu do sloupce typu DOUBLE. Návod jak povolit vkládat empty string for integer in MYSQL.

Když jsem před úpravou v Dbeaver spustil příkaz:

SELECT @@sql_mode;

dostal jsem odpověď

@@sql_mode |
——————————————————————————————————+
IGNORE_SPACE,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION|

po vložení prázdného řetězc do sql-mode mi vrací Dbeaver toto:

@@sql_mode |
——————————–+
IGNORE_SPACE,STRICT_TRANS_TABLES|

IGNORE_SPACE a STRICT_TRANS_TABLES přidává do sql modu sám Dbeaver, ale PHP připojení k databázi na serveru funguje bez STRICT_TRANS_TABLES.

Nyní mohu v MariaDB používat např. fci JSON_EXTRACT, do které se dává jako 2. parametr path a spoustu dalších JSON funkcí, které podporují JSONPath Expressions.

JSONPath syntaxe vždy začíná znakem přeškrtnutého dolaru $ následovaná výběrem elementů. Vybírat element se dá 3 způsoby: 1. název objektu za tečkou, 2. číslo prvku v poli v hranaté závorce, 3. všechny prvky pomocí wildcard *