MySQL社區版升級到Percona Server


出於磁盤空間的考慮,在調研以后把磁盤空間緊張的庫的引擎改為tokudb,(在改為tokudb引擎之前是innodb引擎,已經壓縮過,但空間還是緊張)關於tokudb的優勢各位自行查閱相關資料。要啟用tokudb引擎就需要使用percona server。tokudb引擎被percona server收購。線上mysql的版本是社區版5.5.24,於是升級過程就是 5.5.24 -> 5.6.25 -> 5.7.21 -> percona-5.7.22。在升級到percona 5.7.22以后啟用tokudb引擎,然后改表的引擎。

准備好mysql 5.6.25,mysql 5.7.21,percona-5.7.22(全部放到一個指定路徑,屆時軟鏈就是),percona server下載地址:

https://www.percona.com/downloads/Percona-Server-LATEST/Percona-Server-5.7.22-22/binary/tarball/Percona-Server-5.7.22-22-Linux.x86_64.ssl101.tar.gz

升級前(有一個db01庫,里面有一張t1表):

mysql> use db01
Database changed
mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(200) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.24-log |
+------------+
1 row in set (0.00 sec)

mysql> 

關閉數據庫:

mysql> set global innodb_fast_shutdown=0;
Query OK, 0 rows affected (0.00 sec)

mysql> 
/usr/local/mysql/bin/mysqladmin -uroot -p -S /data/mysql/3306/mysqltmp/mysql.sock shutdown

調整軟連接,用5.6.25啟動(配置文件用5.5的還可以,在用5.7的版本啟動的時候就需要適當的更改,可以找一份5.7的配置),軟件習慣放在/usr/local下面

rm -f mysql
ln -s /usr/local/mysql-5.6.25 mysql

啟動mysql

/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/3306/my.cnf --user=mysql &

在啟動以后查看錯誤日志:

2018-11-22 16:42:33 21876 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_thread_by_event_name' has the wrong structure
2018-11-22 16:42:33 21876 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_account_by_event_name' has the wrong structure
2018-11-22 16:42:33 21876 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_user_by_event_name' has the wrong structure

有這些是正常的,我們需要運行mysql_upgrade

/usr/local/mysql/bin/mysql_upgrade -uroot -p -S /data/mysql/3306/mysqltmp/mysql.sock 

查看版本:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.25-log |
+------------+
1 row in set (0.00 sec)

在數據目錄下面也有一個文件記錄升級版本:mysql_upgrade_info
到這里就從5.5.24升級到了5.6.25. 然后需要從5.6.25升級到5.7.21,這個過程其實是一樣的。就不再闡述。我直接略過。

我這里升級到了5.7.21:

[root@localhost][(none)]> select version();
+------------+
| version()  |
+------------+
| 5.7.21-log |
+------------+
1 row in set (0.00 sec)

下面開始從mysql 5.7.21升級到percona 5.7.22. 正常關閉mysql,刪掉軟連接,從新軟鏈。

mysql -> /usr/local/percona-5.7.22/

啟動percona mysql前需要關閉THP

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag

 啟動percona mysql並且安裝tokudb。

/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/3306/my.cnf --user=mysql &

啟用tokudb引擎:

ps_tokudb_admin --enable -uroot -S /data/mysql/3306/mysqltmp/mysql.sock -p --defaults-file=/data/mysql/3306/my.cnf

輸出如下表示成功:

Installing TokuDB engine...
INFO: Successfully installed TokuDB engine plugin.
mysql> SELECT @@tokudb_version;
+------------------+
| @@tokudb_version |
+------------------+
| 5.7.22-22        |
+------------------+
1 row in set (0.00 sec)

可以看到已經安裝成功。

但是有一個問題就是tokudb的數據目錄默認在innodb的數據目錄下面:

-rw-rw----. 1 mysql mysql    56 Nov 22 16:42 auto.cnf
drwx------. 2 mysql mysql    45 Nov 20 17:05 db01
-rw-------. 1 mysql mysql  1172 Nov 22 17:04 log000000000000.tokulog29
drwx------. 2 mysql root   4096 Nov 22 16:49 mysql
-rw-rw-r--. 1 root  root      6 Nov 22 16:49 mysql_upgrade_info
drwxr-x---. 2 mysql mysql  8192 Nov 22 16:49 performance_schema
-rw-------. 1 mysql mysql  1676 Nov 22 17:01 private_key.pem
-rw-r--r--. 1 mysql mysql   452 Nov 22 17:01 public_key.pem
drwxr-x---. 2 mysql mysql  8192 Nov 22 16:49 sys
-rw-r-----. 1 mysql mysql 16384 Nov 22 17:02 tokudb.directory
-rw-r-----. 1 mysql mysql 16384 Nov 22 17:02 tokudb.environment
-rw-------. 1 mysql mysql     0 Nov 22 17:02 __tokudb_lock_dont_delete_me_data
-rw-------. 1 mysql mysql     0 Nov 22 17:02 __tokudb_lock_dont_delete_me_environment
-rw-------. 1 mysql mysql     0 Nov 22 17:02 __tokudb_lock_dont_delete_me_logs
-rw-------. 1 mysql mysql     0 Nov 22 17:02 __tokudb_lock_dont_delete_me_recovery
-rw-------. 1 mysql mysql     0 Nov 22 17:02 __tokudb_lock_dont_delete_me_temp
-rw-r-----. 1 mysql mysql 16384 Nov 22 17:02 tokudb.rollback

可以看見全部放在一起了,這怎么能夠忍受呢。肯定改啊。關於有數據的修改tokudb的數據目錄需要非常小心。官網參考地址:修改tokudb數據存放位置
下面我們開始移動,首先關閉mysql,然后創建tokudb存放數據的目錄。

mkdir /data/mysql/3306/tokudata -p
chown -R mysql.mysql /data/mysql/3306/tokudata

配置文件增加:

tokudb_data_dir               = /data/mysql/3306/tokudata
tokudb_tmp_dir                = /data/mysql/3306/tokudata
tokudb_log_dir                = /data/mysql/3306/tokudata
innodb_use_native_aio         = 0

日志文件,臨時文件,數據目錄都是/data/mysql/3306/tokudata,當然你可以分的更詳細。然后移動文件:
按照官網:*.tokudb 及 __tokudb_lock_dont_delete_me_data 存放位置

1. 修改 tokudb_data_dir = /data/mysql/3306/tokudata

mv /data/mysql/3306/data/__tokudb_lock_dont_delete_me_data /data/mysql/3306/tokudata/

2. 修改 tokudb_tmp_dir = /data/mysql/3306/tokudata

tokudb_tmp_dir 默認會讀取 tokudb_data_dir 這個值,所以需要移動以及在配置文件顯示指定。

mv /data/mysql/3306/data/__tokudb_lock_dont_delete_me_temp /data/mysql/3306/tokudata/

3. 修改 tokudb_log_dir = /data/mysql/3306/tokudata

mv /data/mysql/3306/data/log000000000000.tokulog29 /data/mysql/3306/tokudata    
mv /data/mysql/3306/data/__tokudb_lock_dont_delete_me_logs /data/mysql/3306/tokudata/

4. 最后移動__tokudb_lock_dont_delete_me_recovery

mv /data/mysql/3306/data/__tokudb_lock_dont_delete_me_recovery  /data/mysql/3306/tokudata/
ll /data/mysql/3306/tokudata/
total 4
-rw-------. 1 mysql mysql 2723 Nov 22 17:09 log000000000000.tokulog29
-rw-------. 1 mysql mysql    0 Nov 22 17:02 __tokudb_lock_dont_delete_me_data
-rw-------. 1 mysql mysql    0 Nov 22 17:02 __tokudb_lock_dont_delete_me_logs
-rw-------. 1 mysql mysql    0 Nov 22 17:02 __tokudb_lock_dont_delete_me_recovery
-rw-------. 1 mysql mysql    0 Nov 22 17:02 __tokudb_lock_dont_delete_me_temp

啟動percona mysql,啟動完成以后注意查看一下錯誤日志有沒有異常。然后再一次檢查tokudb引擎是否啟用了:

mysql> SELECT @@tokudb_version;
+------------------+
| @@tokudb_version |
+------------------+
| 5.7.22-22        |
+------------------+
1 row in set (0.00 sec)

至此已經升級到了percona 5.7.22,並且啟用了tokudb引擎而且也改了數據目錄。我們把原來的t1表的引擎修改成tokudb引擎看看。壓縮算法有好多種,有興趣的自行了解。

mysql> show create table t1\G                             
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(200) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table t1 row_format=TOKUDB_LZMA engine=tokudb;
Query OK, 1 row affected (0.13 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> show create table t1\G                              
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(200) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8 ROW_FORMAT=TOKUDB_LZMA
1 row in set (0.00 sec)

mysql> 

查看數據目錄,數據也存放在了我們指定的位置:

/data/mysql/3306/tokudata/db01
[root@localhost]# ll
total 128
-rw-r-----. 1 mysql mysql 32768 Nov 22 17:26 t1_key_id_8_2_1d.tokudb
-rw-r-----. 1 mysql mysql 32768 Nov 22 17:26 t1_main_8_3_1d.tokudb
-rw-r-----. 1 mysql mysql 65536 Nov 22 17:26 t1_status_8_4_1d.tokudb

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM