# MySQL Upgrade from 8.0.4 to 8.4.x  (Ubuntu)

This article provides step-by-step instructions to upgrade MySQL from **version 8.0.4 to 8.4**.**x.** It covers prerequisites, pre-upgrade checks, installation steps, post-upgrade validations, and rollback procedures to ensure a safe and production-ready upgrade.

### Prerequisites

* **OS Compatibility**
  * Confirm the operating system supports MySQL 8.4.
  * **Recommended:** Ubuntu 22.04 LTS or later.
  * Check OS version:

    ```bash
    cat /etc/os-release
    ```
* **System Requirements**
  * **Disk space:** Sufficient for backups and rollback
  * **Memory:** Minimum 16 GB RAM
  * **Access:** Root or sudo privileges

### Pre-Upgrade Checks

* **Backup**
  * **Logical backup:**

    ```bash
    mysqldump -u root -p ovaledgedb > /home/ubuntu/mysql_backup/ovaledgedb_backup.sql
    ```

    Ensure you use the correct schema.

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FsKOvkanEAXSJx7V0YTA8%2Fimage.png?alt=media&#x26;token=d024a112-d81d-4e8e-8c43-aa2c2ab41abc" alt=""><figcaption></figcaption></figure>
  * Physical backup (recommended):
    * Use Percona XtraBackup or filesystem-level copy.
  * **Backup configuration files:**

    ```bash
    sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /home/ubuntu/mysql_backup/
    sudo cp -a /var/lib/mysql /home/ubuntu/mysql_backup/
    ```

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FklJtccgqAblTjRUokaY1%2Fimage.png?alt=media&#x26;token=c057da78-a509-46ac-a370-82b34d8349c1" alt=""><figcaption></figcaption></figure>
* **Collect Pre-Upgrade Database Information**
  * **Database size query:**

    ```sql
    SELECT 
        table_schema AS "Database Name", 
        ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS "DB Size (MB)"
    FROM information_schema.tables 
    GROUP BY table_schema;
    ```

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FzZWTs5g5LfuscVDKABec%2Fimage.png?alt=media&#x26;token=e1492846-4c05-4d51-a1fc-42cf286f7d66" alt=""><figcaption></figcaption></figure>
  * Row count query:\
    \[[Download Query File](https://ovaledge.s3.us-west-1.amazonaws.com/queries/dbsize.sql?utm_source=chatgpt.com)]

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FURPx2McAk6mjPBVZdRw7%2Fimage.png?alt=media&#x26;token=8801ce00-875a-4e3f-9cfa-23a83a3ee0e0" alt=""><figcaption></figcaption></figure>
  * Save query outputs for post-upgrade validation.

### Upgrade Execution

* **Stop MySQL Service**

  ```bash
  sudo systemctl stop mysql
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FqCx7D9LcQDXQeBnVW0Ik%2Fimage.png?alt=media&#x26;token=50e17393-fa49-4c07-9efa-8ef20fb3d3fd" alt=""><figcaption></figcaption></figure>
* **Download MySQL APT Repository**&#x20;
* Update package manager repo i,e, using deb packages for ubuntu.

  ```bash
  cd
  wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FoKOHoDwAqKNR9TJUk1BM%2Fimage.png?alt=media&#x26;token=1a4173a0-1089-4683-ba26-d40339f854cd" alt=""><figcaption></figcaption></figure>
* **Update Repository**\
  Update the deb packages as shown below.

  ```bash
  sudo dpkg -i mysql-apt-config_0.8.33-1_all.deb
  ```

  * Select the highlighted package below and hit Enter.

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FsmNEwEAAKeAi7uCYEa02%2Fimage.png?alt=media&#x26;token=6a76959f-e769-400f-b59f-8933598bc84f" alt=""><figcaption></figcaption></figure>
  * Select MySQL 8.4 LTS when prompted.

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FUO5jdibgNF0bHfmmAgQX%2Fimage.png?alt=media&#x26;token=d5737875-7c37-4a33-a551-76c13784ddd1" alt=""><figcaption></figcaption></figure>
  * Confirm selections and continue.

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2F9aiXkLNIgS7yaGCWc9Vv%2Fimage.png?alt=media&#x26;token=1828f5d6-e074-44ce-90bb-d3c786148b9e" alt=""><figcaption></figcaption></figure>
  * Finally you will get below screen,

    <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FdQbYGISqzkAAYZvjEU5z%2Fimage.png?alt=media&#x26;token=5ee80d6c-e72e-4b5f-97c5-3945eb7ecb32" alt=""><figcaption></figcaption></figure>
* **Update Packages**\
  Update the apt package repository.

  ```bash
  sudo apt update -y
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FXTjDwAXzESWC6QFrC3fC%2Fimage.png?alt=media&#x26;token=5a9fd5f9-3295-42f7-a6b6-6281452c8d89" alt=""><figcaption></figcaption></figure>
* **Upgrade MySQL Server**\
  Run the following command to upgrade the MySQL server:

  ```bash
  sudo apt-get install mysql-server
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2Fit7nCwChEjLQbT3KpGpE%2Fimage.png?alt=media&#x26;token=ba0a2526-1f4a-49ae-bda5-20409b8c9054" alt=""><figcaption></figcaption></figure>
* **Update Configuration**\
  Open the MySQL configuration file:

  ```bash
  sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
  ```

  Add:

  ```
  mysql_native_password=ON
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FyaTWPZDLlS4r2bTPe6Vf%2Fimage.png?alt=media&#x26;token=dfbe4da8-33e8-4917-9ea5-1a5566e30db9" alt=""><figcaption></figcaption></figure>

  Save file and restart MySQL

  ```bash
  sudo systemctl restart mysql
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FJ8ZvGGnwhuQd2PjDVMQk%2Fimage.png?alt=media&#x26;token=02bfe2f7-7994-4763-be97-692436932c86" alt=""><figcaption></figcaption></figure>
* **Verify Version**

  ```bash
  mysql --version
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2Fj8mdwLKKF7PMBNdHuWnr%2Fimage.png?alt=media&#x26;token=fa2e8d81-b149-48e5-9068-c767613cdd1c" alt=""><figcaption></figcaption></figure>

### Post-Upgrade Validations

* **Row Count Verification**

  ```bash
  mysql -u root -p
  ```

  Run \[[Row Count Query](https://ovaledge.s3.us-west-1.amazonaws.com/queries/dbsize.sql?utm_source=chatgpt.com)] and compare results with pre-upgrade counts.

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2Fk9olDy8lkaJ1wGSq1q01%2Fimage.png?alt=media&#x26;token=236d2dbb-5536-462a-b6eb-8334f132be38" alt=""><figcaption></figcaption></figure>
* **Database Size Verification**<br>

  ```sql
  SELECT 
      table_schema AS "Database Name", 
      ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS "DB Size (MB)"
  FROM information_schema.tables 
  GROUP BY table_schema;
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FL5cFsfJilaOadQPrcUDd%2Fimage.png?alt=media&#x26;token=a7d22615-5abc-409b-8ada-ac1d580cfc56" alt=""><figcaption></figcaption></figure>

  Compare with pre-upgrade values.
* **Update MySQL Parameters**\
  Edit `/etc/mysql/mysql.conf.d/mysqld.cnf` and add:

  ```
  max_binlog_size=1GB
  binlog_expire_logs_seconds=2592000
  group_concat_max_len=50000
  max_connections=600
  innodb_buffer_pool_size=10GB
  max_allowed_packet=1G
  bind-address=0.0.0.0
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2F7LbyU0Qs8TVw9PkIvVeR%2Fimage.png?alt=media&#x26;token=0db0e56c-bb34-4c01-b82b-c94f1845b140" alt=""><figcaption></figcaption></figure>

  Adjust values based on instance size.\
  **Restart MySQL:**

  ```bash
  sudo systemctl restart mysql
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2Fp5HezocHncQ3wJwpl8Lz%2Fimage.png?alt=media&#x26;token=950f259c-8861-4804-8556-31255f7e91a0" alt=""><figcaption></figcaption></figure>
* **Update OvalEdge User Password**

  ```sql
  ALTER USER 'ovaledge'@'localhost' IDENTIFIED BY '<Password>';
  ALTER USER 'ovaledge'@'%' IDENTIFIED BY '<Password>';
  FLUSH PRIVILEGES;
  ```
* **Check Logs**

  ```bash
  tail -n 100 /var/log/mysql/error.log
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FEL5tnoeDCbUmlRZqWn0m%2Fimage.png?alt=media&#x26;token=c78f2245-6975-4307-8d9e-3df30ad681d3" alt=""><figcaption></figcaption></figure>
* Once validations are complete, point the OvalEdge application to MySQL 8.4.

### Rollback Plan (If Needed)

* Back up MySQL configuration and data directory:

  ```bash
  sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /home/ubuntu/mysql8.4_backup/
  sudo cp -a /var/lib/mysql /home/ubuntu/mysql8.4_backup/
  ```

  <figure><img src="https://1813356899-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTnkoJQml0pok9awFDhx%2Fuploads%2FFQ4lxZQYFQ7aYO2D3C2h%2Fimage.png?alt=media&#x26;token=1ff67f35-689c-4c57-a202-124d9b2f1171" alt=""><figcaption></figcaption></figure>
* Stop MySQL service.
* Reinstall MySQL 8.0.4.
* Restore data from backups.

### Additional Information

* Test MySQL 8.4 installation in a separate folder before applying in production.
* Example: MySQL 8.4.4 installation in a separate folder on Ubuntu.

***

Copyright © 2025, OvalEdge LLC, Peachtree Corners, GA, USA.
