Skip to content

Database Migration

MySQL Version Upgrade

Pre-Migration

# Check current version
mysql --version

# Check storage engines
mysql -e "SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE ENGINE NOT IN ('InnoDB', 'MyISAM');"

# Check for deprecated features
mysqlcheck -u root -p --all-databases --check-upgrade

# Backup
mysqldump -u root -p --all-databases --routines --triggers --events > pre-upgrade-backup.sql

Upgrade MySQL 5.7 → 8.0

# Stop MySQL
systemctl stop mysql

# Add MySQL 8.0 repository
apt install -y gnupg
wget -q https://repo.mysql.com/mysql-apt-config_0.8.24-1_all.deb
dpkg -i mysql-apt-config_0.8.24-1_all.deb
apt update

# Upgrade
apt install -y mysql-server

# Run upgrade check
mysql_upgrade -u root -p

# Restart
systemctl restart mysql

# Verify
mysql --version
mysqlcheck -u root -p --all-databases

Character Set & Collation Migration

-- Check current charset
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

-- Database level
ALTER DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Table level
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Column level
ALTER TABLE wp_posts MODIFY post_title TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- All tables in database
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'wordpress' AND TABLE_TYPE = 'BASE TABLE';

Migration Script

migrate-charset.sh
#!/bin/bash
DB="wordpress"
USER="root"
PASS="password"

echo "ALTER DATABASE $DB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" | mysql -u$USER -p$PASS $DB

TABLES=$(mysql -u$USER -p$PASS $DB -e "SHOW TABLES" | tail -n +2)
for TABLE in $TABLES; do
    echo "Converting $TABLE..."
    echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" | mysql -u$USER -p$PASS $DB
done

echo "Done."

PostgreSQL Version Upgrade

# Check current version
psql --version

# List clusters
pg_lsclusters

# Install new version
apt install -y postgresql-16

# Stop old cluster
pg_ctlcluster 14 main stop

# Upgrade using pg_upgradecluster
pg_upgradecluster 14 main

# Start new cluster
pg_ctlcluster 16 main start

# Verify
psql -V
sudo -u postgres psql -c "SELECT version();"

Migrate Between Database Engines

MySQL → MariaDB (Direct Upgrade)

# Stop MySQL
systemctl stop mysql

# Install MariaDB
apt install -y mariadb-server

# Start MariaDB (uses MySQL data directory)
systemctl start mariadb

# Run upgrade
mysql_upgrade -u root -p

# Verify
mysql --version

MariaDB → MySQL

# Backup from MariaDB
mysqldump -u root -p --all-databases > mariadb-backup.sql

# Install MySQL
apt install -y mysql-server

# Restore
mysql -u root -p < mariadb-backup.sql

# Run mysql_upgrade
mysql_upgrade -u root -p

Cross-Server Migration

# Direct dump and pipe
mysqldump -u root -p wordpress | mysql -h new-server -u root -p wordpress

# Compressed transfer
mysqldump -u root -p wordpress | gzip | ssh user@new-server "gunzip | mysql -u root -p wordpress"

# Using mysqldump with progress
mysqldump -u root -p --single-transaction --quick wordpress | pv | mysql -h new-server -u root -p wordpress

WordPress Database Migration

# Export
wp db export wp-backup.sql

# Search & replace URLs
wp search-replace "http://old.com" "https://new.com" --all-tables

# Import on new server
wp db import wp-backup.sql

# Verify
wp db check

Migration Checklist

  • Full backup taken
  • Character set compatibility verified
  • Storage engines compatible
  • Application connection strings updated
  • Post-migration integrity check run
  • Performance tested
  • Rollback plan ready (old version still available)