Ghost 5+ -- How to Migrate From MariaDB 10.x to MySQL 8.x
MariaDB 10.x
If you've recently tried to upgrade to Ghost v5 you had most definitely got into a big, big mess. Database Compatibility Issues.
Just to point out, MariaDB is not an officially supported database for Ghost. It just happened to work given the similarities with MySQL, but they optimize and test for MySQL 5 and 8.
Ghost v5 will only support MySQL 8 in production, so I'd strongly suggest switching to MySQL 8 to ensure you're running on the recommended setup that kinda shitty but hey – and trust me upgrading from MariaDB is a breaking change.
Ghost 5.0
When to update?
The best time to do a major version update is shortly after the first minor version - so for Ghost 5.x, the best time to update will be when 5.1.0 is released.
Ghost 5.0 includes significant changes to the Ghost API and database support to ensure optimal performance.
Supported databases
MySQL 8 is the only supported database for both development and production environments.
SQLite3 is supported only in development environments where scalability and data consistency across updates is not critical. (during local theme development, for example)
MySQL 5 is no longer supported in any environment.
Migrate
This guide should work similarly well on other platforms.
Here are the steps to follow:
1. Clone your server
The importance of backup Cannot be STRESSED enough – backups, backups, backups!
2. Export the database(s)
To access the MySQL shell type the following command and enter your MySQL root user password when prompted:
First, stop
the targeted services:
$ cd /var/www/ghost_location
ghost stop
##
#
## Stop nginx mariadb services
$ sudo systemctl stop nginx mariadb
## Check for state
$ sudo system status nginx mariadb
$ sudo mysql -u root -p
If you haven’t set a password for your MySQL root user, you can omit the -p
option.
$ sudo mysql -u root -p
Output
mysql> SHOW databases;
+--------------------+
| Database |
+--------------------+
| your_database_name |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
15 rows in set (0.23 sec)
mysql>
Show All MySQL Users
To get a list of all MySQL user accounts, use the SELECT statement to retrieve all rows from the mysql.users table:
mysql> SELECT User, Host FROM mysql.user;
Output
+------------------+-----------+
| User | Host |
+------------------+-----------+
| debian-sys-maint | localhost |
| your_database_user_id localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
15 rows in set (0.21 sec)
mysql> quit;
Before we export the database let's:
1. Check for the host IP address or localhost as this is important when dealing with the database.
2. Confirm the database name, user ID, and password from config.production.json under /var/www/ghost/
Exporting:
$ mkdir ~/databases
$ cd ~/databases
$ mysqldump --opt -Q -u your_database_user_id -p your_database_name > ~/databases/your_database_name.sql
3. Remove MariaDB
Uninstall MariaDB.
$ sudo dpkg -l | grep mariadb
ii libmariadb3:amd64 1:10.8.2+maria~focal amd64 MariaDB database client library
ii mariadb-client 1:10.8.2+maria~focal all MariaDB database client (metapackage depending on the latest version)
rc mariadb-client-10.3 1:10.3.34-0ubuntu0.20.04.1 amd64 MariaDB database client binaries
ii mariadb-client-10.8 1:10.8.2+maria~focal amd64 MariaDB database client binaries
ii mariadb-client-core-10.8 1:10.8.2+maria~focal amd64 MariaDB database core client binaries
ii mariadb-common 1:10.8.2+maria~focal all MariaDB common configuration files
ii mariadb-server 1:10.8.2+maria~focal all MariaDB database server (metapackage depending on the latest version)
rc mariadb-server-10.3 1:10.3.34-0ubuntu0.20.04.1 amd64 MariaDB database server binaries
ii mariadb-server-10.8 1:10.8.2+maria~focal amd64 MariaDB database server binaries
ii mariadb-server-core-10.8 1:10.8.2+maria~focal amd64 MariaDB database core server files
###
##
#
$ sudo dpkg -l | grep mysql
ii automysqlbackup 2.6+debian.4-2 all daily, weekly and monthly backup for your MySQL database
ii libdbd-mysql-perl:amd64 4.050-3 amd64 Perl5 database interface to the MariaDB/MySQL database
ii libmysqlclient21:amd64 8.0.28-0ubuntu0.20.04.3 amd64 MySQL database client library
ii mysql-client 8.0.28-0ubuntu0.20.04.3 all MySQL database client (metapackage depending on the latest version)
ii mysql-client-8.0 8.0.28-0ubuntu0.20.04.3 amd64 MySQL database client binaries
ii mysql-client-core-8.0 8.0.28-0ubuntu0.20.04.3 amd64 MySQL database core client binaries
ii mysql-common 1:10.8.2+maria~focal
###
##
#
...
## Stop mariadb service
$ sudo systemctl stop mariadb
## purge mariadb confg
$ sudo apt purge 'mariadb-*'
## check for any mariadb instances - result should be empty
$ sudo dpkg -l | grep mariadb
... now, let's remove any MySQL instances:
## purge mysql confg
$ sudo apt purge 'mysql-*'
## check for any mysql instances - result should be empty
sudo dpkg -l | grep mysql
... apply to the following commands:
$ sudo apt autoremove
$ sudo apt autoclean
$ sudo rm /etc/apt/sources.list.d/mariadb.list
4. Install MySQL
$ sudo apt update
$ sudo apt install mysql-server
$ sudo systemctl start mysql.service
$ sudo mysql_secure_installation
Type n
for password validation, and enter your password for root
.
Then y
for all other prompts.
Now let’s create the database user(s) and import your database(s).
$ sudo mysql -u root -p
##
#
mysql> create database your_database_name;
mysql> create user 'your_database_user_id'@'localhost' identified by 'password';
mysql> grant all privileges on your_database_name.* to 'your_database_user_id'@'localhost';
mysql> flush privileges;
mysql> quit;
5. Import your database(s)
$ mysql -u your_database_user_id -p your_database_name < /home/user/databases/your_database_name.sql
6. Test Ghost
$ sudo systemctl start nginx
$ cd /var/www/your_website_folder
ghost start
Check that Ghost starts correctly. If there are any issues, follow the guidance from the output or run ghost doctor
. Do not perform any upgrades if you encounter an error.