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.