出於磁盤空間的考慮,在調研之後把磁盤空間緊張的庫的引擎改成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引擎,而後改表的引擎。html
準備好mysql 5.6.25,mysql 5.7.21,percona-5.7.22(所有放到一個指定路徑,屆時軟鏈就是),percona server下載地址:mysql
升級前(有一個db01庫,裏面有一張t1表):sql
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下面spa
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 &
在啓動之後查看錯誤日誌:code
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_upgradeorm
/usr/local/mysql/bin/mysql_upgrade -uroot -p -S /data/mysql/3306/mysqltmp/mysql.sock
查看版本:server
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