MySQL 升級詳細步驟 (包括 Percona)

流水無情88發表於2014-09-18

MySQL 升級步驟

MySQL 5.1.72 升級到 MySQL 5.5.36

鑑於我在升級的時候遇到的麻煩問題,我覺得有必要把一些細節說清楚,免得引起誤解了。感覺官方文件上的升級步驟寫的比較簡單,很容易引起混淆,感覺同我當時參照官方文件學習定製安裝 MySQL 一樣蛋疼。可能真的是外國淫的思維跟我差距太大了。

資料庫情況:本人測試的都是 Linux Generic x86_64 版本的,也是定製安裝到制定的資料庫目錄的。

詳細升級步驟

1.MySQL 5.1.72 啟動的例項 ins1

假設你已經安裝了 MySQL 5.1.72,並且成功的啟動了一個例項 ins1。軟體可以在官網 MySQL 5.1.72 下載。

2.備份 ins1的資料和配置檔案my1.cnf

無論以前操作了多少次升級步驟,升級前備份資料那是必須的!我這裡是測試資料,就直接通過mysqldump 工具備份的,如果是生產庫,可以使用 percona 公司的線上備份工具進行備份。

複製一份my1.cnf到其他位置進行備份,防止升級失敗後能夠快速的恢復 ins1。

3.關閉 ins1

 mysqladmin -uroot -p -S $sockdir  shutdown 

4.通過 MySQL 5.5.36 啟動 例項ins1 原來的資料目錄,命名為 ins2

1)修改my1.cnf ,把一些與高版本不相容的引數或者一些廢棄的引數修改成高版本能夠接受的引數。

2)用高版本的 MySQL 5.5.36 來啟動,切記不要用低版本的 MySQL 啟動,那樣 my1.cnf 的修改也米有意義了。

因為高版本的系統庫 mysql database 和低版本的 mysql database 會有一些表是不相容的,所以為了讓高版本的 MySQL 能夠啟動 低版本的系統資料,需要加上引數 --skip-grant-tables 來忽略mysql database 裡授權表(grant tables)的驗證。同時,忽略授權表啟動 MySQL 例項 ins2 後, 為了保證 MySQL 例項的安全,可以加上引數 --skip-networking 來阻止通過網路來訪問的客戶端。

mysqld_safe --defaults-file=$cnf_path --skip-grant-tables --skip-networking &

5.執行 mysql_upgrade

啟動例項 ins2 成功以後,通過高版本的 MySQL 5.5.36 的 bin 目錄 mysql_upgrade 命令來升級 ins2

mysql_upgrade -uroot -p -S $socket_path

這個步驟實際執行的內容(來源於手冊):

mysqlcheck --all-databases --check-upgrade --auto-repair
mysql < fix_priv_tables
mysqlcheck --all-databases --check-upgrade --fix-db-names --fix-table-names

如果看到最後面顯示的OK,表示成功了

...
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
percona51.ptablet                                  OK
Running 'mysql_fix_privilege_tables'...
OK

6.重啟 mysql 例項ins2

用MySQL 5.5.36 的二進位制包(不是 MySQL 5.1.72)

mysqladmin -uroot -p -S $sockdir  shutdown
#這次正常啟動,不需要帶上其他引數。
mysqld_safe --defaults-file=$cnf_path &

Percona Server 5.1.61 升級到 Percona Server 5.5.39

Percona Server 是 Percona 公司根據 MySQL 存在的一些效能上的缺陷進行改進,從而形成了一個新的免費的 MySQL 版本。 他們的升級文件就是三個字來形容就是 “太簡單”,為了把一些步驟說清楚,也為了我以後少走點彎路,我還是把我升級步驟詳細的羅列出來,以供日後查閱吧。

這次升級我從安裝 Percona Server 例項開始講述,因為 Percona 的配置檔案和 MySQL 還是有部分割槽別的,新手用二進位制檔案安裝的話可能需要一回來查詢執行檔案。

1.安裝 Percona Server 5.1.61 例項 P1

1)下載 Percona Server 5.1.61

2)解壓縮檔案,然後進入到安裝目錄下。

我這裡是 /home/devops/Percona-Server-5.1.61

3)根據 配置檔案來檔案:Percona5.1.txt 安裝系統庫目錄

這個目錄是針對我自己的安裝目錄,引數需要根據自己的 OS 進行調整。主要需要注意的是如下幾個引數:

#這兩個引數在高版本的引數檔案中需要調整
ledir           = /home/devops/Percona-Server-5.1.61/libexec
language                = /home/devops/Percona-Server-5.1.61/share/mysql/english
#根據自己記憶體大小來調整
innodb_buffer_pool_size = 256M 

配置檔案穿件完畢後,安裝系統庫。執行命令:

./bin/mysql_install_db --defaults-file=/home/devops/cnf/mysql4308.cnf --basedir=/home/devops/Percona-Server-5.1.61

4)驗證系統庫是否安裝成功

要驗證系統庫是否安裝成功,可以在引數檔案中指定的data-dir目錄下看看是否有 mysql,test資料夾,以及mysql資料夾下面是否有很多以 frm、MYI、MYD 接尾的系統檔案。

5)啟動例項 P1

 
$ cd /home/devops/Percona-Server-5.1.61/bin
./mysqld_safe --defaults-file=/home/devops/cnf/mysql4308.cnf &

# ps -ef | grep 4308 驗證是否成功,如果沒有,請看看 MySQL 錯誤日誌,是否哪裡的引數出現了問題。

2.備份5.1引數檔案,修改引數檔案來滿足 Percona 5.5 的引數要求(重要!!)

備份 mysql4308.cnf :$ cp mysql4308.cnf mysql4308_bak.cnf。修改 mysql4308.cnf 來符合 Percona Server 5.5.36 的引數需求,具體的差異可以檢視 Percona文件,本人操作的時候主要修改瞭如下的幾個引數:

ledir           = /home/devops/percona/percona5.5.39/bin
lc-messages-dir         =/home/devops/percona/percona5.5.39/share

修改後的引數檔案 檔案:Percona5.5.txt

3.關閉 例項 P1,用 Percona Server 5.5.39 以(skip-grant-tables)方式啟動 例項 P2

1)下載Percona Server 5.5.39  http://www.percona.com/redir/downloads/Percona-Server-5.5/Percona-Server-5.5.39-36.0/binary/tarball/Percona-Server-5.5.39-rel36.0-697.Linux.x86_64.tar.gz,解壓縮。

2)重啟 MySQL

這次是第一次用高版本的 MySQL軟體啟動低版本的資料,避免許可權表的驗證,需要加上 skip-grant-tables 引數。

cd /home/devops/percona/percona5.5.39/bin
./mysqladmin -uroot -p -S /home/devops/mysql4308/mysqld.sock  shutdown
./mysqld_safe --defaults-file=/home/devops/cnf/mysq4308.cnf --skip-grant-tables --skip-networking &

note: 最後一步執行mysqld_safe的時候,很可能因為引數檔案的引數不能被識別而導致出現啟動錯誤,請根據錯誤日誌的提示來修正。

4.執行 Percona Server 5.5.36 的 mysql_upgrade

./mysql_upgrade -uroot -p -S /home/devops/mysql4308/mysqld.sock

執行後如果出現下面的情況,表示 OK 了。

......
mysql.user                                         OK
percona51.ptablet                                  OK
Running 'mysql_fix_privilege_tables'...
OK

5.關閉例項 P2,然後重啟 MySQL

cd /home/devops/percona/percona5.5.39/bin
mysqladmin -uroot -p -S /home/devops/mysql4308/mysqld.sock shutdown
./mysqld_safe --defaults-file=/home/devops/cnf/mysq4308.cnf &

6.驗證是否成功

./mysql -uroot -p -S /home/devops/mysql4308/mysqld.sock 
mysql> status
--------------
./mysql  Ver 14.14 Distrib 5.5.39-36.0, for Linux (x86_64) using readline 5.1

....
Server version:         5.5.39-36.0-log Percona Server (GPL), Release 36.0, Revision 697
....

可以看到版本是 5.5.39-36.0的了。

Percona Server 5.1.61 升級到 MySQL 5.5.36

可能是因為 Percona 和 MySQL 對於系統表空間的解讀方式不一致,我在升級以後,發現無法用 MySQL 5.5.36 來啟動 Percona Server 5.1.61 的例項。錯誤日誌提示的是 共享表空間無法開啟,暫時先不這麼跨軟體升級,以後閒的時候可以再看看兩者的區別。

目前只是知道 Percona 對 MySQL 做了一些效能上的優化與擴充。

Percona5.1.txt

[client]
port            = 4308
socket          = /home/devops/mysql4308/mysqld.sock

[mysqld_safe]
user            = devops
nice            = 0
#ledir           = /home/devops/percona/percona5.5.39/bin
ledir           = /home/devops/Percona-Server-5.1.61/libexec
#ledir          = /home/mysql/
#mysqld         = @home_mysql_mysql_libexec_mysqld


[mysqld]
server-id               = 2949
bind-address            = localhost
port                    = 4308
pid-file                = /home/devops/mysql4308/mysqld.pid
socket                  = /home/devops/mysql4308/mysqld.sock
basedir                 = /home/devops/percona/Percona-Server-5.1.61
datadir                 = /home/devops/mysql4308
innodb_data_home_dir    = /home/devops/mysql4308
innodb_log_group_home_dir       = /home/devops/mysql4308
tmpdir                  = /home/devops/mysql4308
log-error               = /home/devops/mysql4308/mysqld.log
slow_query_log          = 2
slow_query_log_file     = /home/devops/mysql4308/mysql-slow.log 
log_bin                 = /home/devops/mysql4308/mysql-bin.log
binlog_format           = MIXED
relay-log               = mysqld-relay-bin

user                    = devops
language                = /home/devops/Percona-Server-5.1.61/share/mysql/english
#lc-messages-dir                =/home/devops/percona/percona5.5.39/share
table_cache             = 512
long_query_time         = 5
max_connections         = 300
query_cache_type        = 0
character-set-server    = utf8
#default-character-set   = utf8
default-storage-engine  = innodb
skip-external-locking
expire_logs_days        = 7
max_binlog_size         = 100M
max_allowed_packet      = 16M

# innodb plugin

innodb_buffer_pool_size = 256M
innodb_data_file_path   = ibdata1:64M:autoextend
innodb_autoextend_increment     = 16
innodb_log_files_in_group       = 2
innodb_log_file_size    = 64M
innodb_lock_wait_timeout        = 5
innodb_flush_method     = O_DIRECT
innodb_flush_log_at_trx_commit    = 0
innodb_file_per_table      = 1
innodb_file_format         = Barracuda
innodb_file_format_check         = ON
#innodb_adaptive_checkpoint = estimate
#innodb_expand_import       = 1
innodb_read_io_threads     = 8
#innodb_stats_method        = nulls_unequal
#innodb_strict_mode         = 1
innodb_thread_concurrency  = 12
innodb_write_io_threads    = 3
innodb_read_io_threads     = 3
innodb_io_capacity         = 200
#innodb_adaptive_flushing   = false

# percona
innodb_page_size=8k
#innodb_extra_rsegments=8
#innodb_use_purge_thread=4
#innodb_stats_update_need_lock=0
#innodb_fast_checksum=1
#log_slow_verbosity=full
#userstat_running=1
#enable_query_response_time_stats=1

# percona For SSD
#innodb_adaptive_checkpoint=3
#innodb_flush_neighbor_pages=0


[mysqldump]
quick
quote-names
max_allowed_packet      = 16M
default-character-set   = utf8

[mysql]
default-character-set = utf8
View Code

Percona5.5.txt

View Code

 

 

相關文章