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
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
Percona5.5.txt