MySQL cseréje MariaDB kiszolgálóra

Számos oka lehet annak, ha valaki szeretné a MySQL kiszolgálóját MariaDB-re cserélni, és ezt nem csak a MariaDB fejlesztői gondolják így. Mielőtt azonban nekilátnánk, érdemes átnézni a kompatibilitási kérdések sorát is. Mivel azonban az ígéret szerint - legalábbis egyelőre - a binárisok szintjén a két rendszer kompatibilis egymással, nem okozhat túl nagy fájdalmat a csere. Ezt a folyamatot jártuk körül egy korábbi blogbejegyzésben már összeállított Debian Jessie webszerver esetében, amelyre azóta került egy ILIAS és egy Moodle e-learning keretrendszer is. Az átállás nem volt zökkenőmentes, bár már többször is sikerült minden gond nélkül megcsinálni, igaz, akkor MySQL 5.6-os kiszolgálókat cseréltünk MariaDB 10.0-ás rendszerekre, amelyeket aztán később frissítettünk MariaDB 10.1-re. Most azonban a Debian Jessie terjesztésben található MySQL 5.5-ös változatot fogjuk egyetlen lépésben lecserélni a MariaDB 10.1-es kiszolgálójára.

A MariaDB csomagtárolójának beállítása:

apt-get install software-properties-common
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
add-apt-repository 'deb [arch=amd64,i386] http://ftp.bme.hu/pub/mirrors/mariadb/repo/10.1/debian jessie main'
apt-get update

Most pedig jöjjön a csere:

root@webserver:~# apt-get install mariadb-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  galera-3 gawk iproute libjemalloc1 libmariadbclient18 libmpfr4
  libmysqlclient18 libsigsegv2 mariadb-client-10.1 mariadb-client-core-10.1
  mariadb-common mariadb-server-10.1 mariadb-server-core-10.1 rsync
Suggested packages:
  gawk-doc mariadb-test netcat-openbsd socat tinyca
The following packages will be REMOVED:
  mysql-client-5.5 mysql-server mysql-server-5.5 mysql-server-core-5.5
The following NEW packages will be installed:
  galera-3 gawk iproute libjemalloc1 libmariadbclient18 libmpfr4 libsigsegv2
  mariadb-client-10.1 mariadb-client-core-10.1 mariadb-common mariadb-server
  mariadb-server-10.1 mariadb-server-core-10.1 rsync
The following packages will be upgraded:
  libmysqlclient18
1 upgraded, 14 newly installed, 4 to remove and 1 not upgraded.
Need to get 13.1 MB of archives.
After this operation, 37.3 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Kétszer meg fogja kérdezni, hogy szeretnénk-e új root jelszót beállítani. Mivel a válasz egyértelműen nem, mindkétszer feleljünk egy enter leütésével. A folyamat nem fut le zökkenőmentesen:

dpkg: error processing package mariadb-server-10.1 (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of mariadb-server:
 mariadb-server depends on mariadb-server-10.1 (= 10.1.9+maria-1~jessie); however:
  Package mariadb-server-10.1 is not configured yet.
 
dpkg: error processing package mariadb-server (--configure):
 dependency problems - leaving unconfigured
Processing triggers for libc-bin (2.19-18+deb8u1) ...
Processing triggers for systemd (215-17+deb8u2) ...
Errors were encountered while processing:
 mariadb-server-10.1
 mariadb-server
E: Sub-process /usr/bin/dpkg returned an error code (1)

A /var/log/mysql/error.log fájlban az alábbi ribillió támadt:

2015-12-11 11:48:27 3046660480 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2015-12-11 11:48:27 3046660480 [Note] InnoDB: The InnoDB memory heap is disabled
2015-12-11 11:48:27 3046660480 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-12-11 11:48:27 3046660480 [Note] InnoDB: Memory barrier is not used
2015-12-11 11:48:27 3046660480 [Note] InnoDB: Compressed tables use zlib 1.2.8
2015-12-11 11:48:27 3046660480 [Note] InnoDB: Using Linux native AIO
2015-12-11 11:48:27 3046660480 [Note] InnoDB: Not using CPU crc32 instructions
2015-12-11 11:48:27 3046660480 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-12-11 11:48:27 3046660480 [Note] InnoDB: Completed initialization of buffer pool
2015-12-11 11:48:28 3046660480 [Note] InnoDB: Highest supported file format is Barracuda.
2015-12-11 11:48:29 3046660480 [Note] InnoDB: Creating tablespace and datafile system tables.
2015-12-11 11:48:30 3046660480 [Note] InnoDB: Tablespace and datafile system tables created.
2015-12-11 11:48:30 3046660480 [Warning] InnoDB: Resizing redo log from 2*320 to 2*3072 pages, LSN=158981292
2015-12-11 11:48:30 3046660480 [Warning] InnoDB: Starting to delete and rewrite log files.
2015-12-11 11:48:30 3046660480 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB
2015-12-11 11:48:31 3046660480 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB
2015-12-11 11:48:33 3046660480 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
2015-12-11 11:48:33 3046660480 [Warning] InnoDB: New log files created, LSN=158981644
2015-12-11 11:48:33 3046660480 [Note] InnoDB: 128 rollback segment(s) are active.
2015-12-11 11:48:33 3046660480 [Note] InnoDB: Waiting for purge to start
2015-12-11 11:48:33 3046660480 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.26-74.0 started; log sequence number 158977615
2015-12-11 11:48:33 2659158848 [Note] InnoDB: Dumping buffer pool(s) not yet started
2015-12-11 11:48:34 3045989184 [ERROR] Incorrect definition of table mysql.proc: expected column 'sql_mode' at position 14 to have type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVA
2015-12-11 11:48:34 3045989184 [ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 to have type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH'), found type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_A
ERROR: 1136  Column count doesn't match value count at row 1
2015-12-11 11:48:34 3046660480 [ERROR] Aborting

A probléma forrásának feltárása messzire vezet, azonban szerencsére van egy egyszerű megoldás:

cd /etc/mysql
mv my.cnf my.cnf.old
apt-get install mariadb-server-10.1
systemctl stop mysql
mv my.cnf.old my.cnf
systemctl start mysql

Röviden: átnevezzük a my.cnf fájlt, befejezzük a MariaDB kiszolgáló telepítését, megállítjuk a már futó adatbázist és visszaállítjuk az eredeti my.cnf fájlt, majd újraindítjuk a MariaDB kiszolgálót.

Ez a trükk persze most csak azért működőképes, mert a my.cnf nélkül a MariaDB az eredeti, /var/lib/mysql mappában hoz létre új adatbázisokat. Nekünk viszont a webszerveren a MySQL adatbázisok a /srv/db/mysql mappában találhatóak (a részleteket itt olvashatod el újra). Ha a MySQL adatbázisod a MariaDB telepítése előtt az eredeti helyén volt - azaz a /var/lib/mysql mappában - akkor a fenti trükk csak akkor fog működni, ha a my.cnf át- és visszanevezése közötti időtartamra az adatbázisaidat egy ideiglenes helyre mozgatod át (majd persze vissza is).

A /var/log/mysql/error.log fájlban látható, hogy ugyan most fut a kiszolgáló, de még vannak panaszai:

2015-12-11 13:05:09 3045706112 [Note] Using unique option prefix 'myisam-recover' is error-prone and can break in the future. Please use the full name 'myisam-recover-options' instead.
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2015-12-11 13:05:09 3045706112 [Note] InnoDB: The InnoDB memory heap is disabled
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Memory barrier is not used
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Compressed tables use zlib 1.2.8
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Using Linux native AIO
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Not using CPU crc32 instructions
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Completed initialization of buffer pool
2015-12-11 13:05:09 3045706112 [Note] InnoDB: Highest supported file format is Barracuda.
2015-12-11 13:05:10 3045706112 [Note] InnoDB: 128 rollback segment(s) are active.
2015-12-11 13:05:10 3045706112 [Note] InnoDB: Waiting for purge to start
2015-12-11 13:05:10 3045706112 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.26-74.0 started; log sequence number 159008278
2015-12-11 13:05:10 2659158848 [Note] InnoDB: Dumping buffer pool(s) not yet started
2015-12-11 13:05:10 3045706112 [Note] Plugin 'FEEDBACK' is disabled.
2015-12-11 13:05:10 3045706112 [Note] Server socket created on IP: '127.0.0.1'.
2015-12-11 13:05:10 3045706112 [ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 to have type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH'), found type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_A
2015-12-11 13:05:10 3045706112 [ERROR] mysqld: Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler.
2015-12-11 13:05:10 3045706112 [Note] /usr/sbin/mysqld: ready for connections.
Version: '10.1.9-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

Fejezzük be a lemaradt upgrade folyamatot, majd indítsuk újra a kiszolgálónkat:

mysql-upgrade -u root -p
systemctl stop mysql
systemctl start mysql

A /var/log/mysql/error.log fájl szerint most már minden oké:

2015-12-11 13:11:41 3046431104 [Note] Using unique option prefix 'myisam-recover' is error-prone and can break in the future. Please use the full name 'myisam-recover-options' instead.
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2015-12-11 13:11:41 3046431104 [Note] InnoDB: The InnoDB memory heap is disabled
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Memory barrier is not used
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Compressed tables use zlib 1.2.8
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Using Linux native AIO
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Not using CPU crc32 instructions
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Completed initialization of buffer pool
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Highest supported file format is Barracuda.
2015-12-11 13:11:41 3046431104 [Note] InnoDB: 128 rollback segment(s) are active.
2015-12-11 13:11:41 3046431104 [Note] InnoDB: Waiting for purge to start
2015-12-11 13:11:41 3046431104 [Note] InnoDB:  Percona XtraDB (http://www.percona.com) 5.6.26-74.0 started; log sequence number 162085803
2015-12-11 13:11:41 2659158848 [Note] InnoDB: Dumping buffer pool(s) not yet started
2015-12-11 13:11:41 3046431104 [Note] Plugin 'FEEDBACK' is disabled.
2015-12-11 13:11:41 3046431104 [Note] Server socket created on IP: '127.0.0.1'.
2015-12-11 13:11:41 3046431104 [Note] /usr/sbin/mysqld: ready for connections.
Version: '10.1.9-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

Kipróbálva a webszerverünket, a weboldalak vígan futnak tovább, mintha semmi sem történt volna.

FRISSÍTÉS: ha a MariaDB-re történő váltást a 10.0-ás változattal kezdjük, majd ezt frissítjük a 10.1-es változatra, akkor a váltások zökkenőmentesen történnek, de amikor már a 10.1-es rendszer fut, a /var/log/mysql/error.log tartalma alapján még szükség lesz a következőkre:

mysql_upgrade -u root -p
systemctl restart mysql

Ezután új kiszolgálónk remélhetőleg hiba nélkül fog dolgozni.