Nâng phiên bản MySQL
Mysql
40
White

Bùi Hồng Hà viết ngày 23/05/2015

1. Giới thiệu

Trong quá trình vận hành 1 website chúng ta thường có các task như nâng phiên bản máy chủ web, nâng phiên bản cơ sở dữ liệu (vì mục đích nâng cao hiệu năng hoặc đảm bảo bảo mật). Với những hệ thống sẵn có, quản lý lượng dữ liệu lớn, tác vụ này thường không hề đơn giản, đòi hỏi 1 trình tự hơp lý. Bài viết này tổng kết là trình tự nâng cấp mysql từ phiên bản 5.0.x lên phiên bản 5.6.x và những vấn đề mình gặp phải trong quá trình nâng cấp này.

2. Bài toán

Website sử dụng hệ thống cơ sơ dữ liệu mysql, dưới mô hình master/slave. Cả master/slave đều đang chạy mysql 5.0. Ta cần nâng cấp mysql lên phiên bản 5.6.

Điều kiện

Mọi bài toán đều không có gì khó nếu như không có giới hạn gì. Ở đây ta bắt gặp 1 vài giới hạn cần chú ý như sau:

  • Các query được dùng trong website có thể không tương thích với mysql phiên bản mới.
  • Nâng cấp master đồng thời với slave sẽ có rủi ro khi mà cả 2 gặp lỗi.
  • Dung lượng ổ cứng: khi dung lượng ổ cứng sao lưu không cho phép, ta sẽ phải thực hiện các thao tác công phu hơn 1 chút.

Do vậy, cách tốt nhất là nâng cấp lần lượt slave -> master. Tức là slave sẽ chạy mysql5.6 và master sẽ chạy mysql5.0

Phương pháp

Có 2 cách nâng cấp mysql.

  • Cách truyền thống như được viết trong tài liệu hướng dẫn nâng cấp. Cụ thể ta nâng cấp dần dần qua các phiên bản trung gian bằng script mysql_upgrade.
  • Cách ngắn gọn: dump toàn bộ dữ liệu ở phiên bản cũ và import lại vào phiên bản mới.

Mỗi cách có ưu nhược điểm riêng; cụ thể cách 1 đảm bảo khả năng thành công cao, tuy vậy lại có nhược điểm là chuẩn bị môi trường cho các phiên bản rườm rà, tốn thời gian. Với khoảng cách 2 phiên bản lớn (5.0 -> 5.6: qua 5.1, 5.5) thì việc upgrade khá tốn thời gian.

Cách 2 có ưu điểm nhanh, tuy vậy lại có nhược điểm là tính tương thích giũa 2 phiên bản không tốt, dẫn đến khả năng lỗi sau khi upgrade cao.

Bài viết sẽ trình bày quy trình upgrade theo cách 2.

3. Quy trình:

Bước 1: dump toàn bộ dữ liệu

Ta có thể dump toàn bộ dữ liệu từ slave hoặc master hiện tại.

a. Dump dữ liệu từ slave

mysql> stop slave
mysql> show slave status;

Ghi nhớ các thông tin: master_host, master_port, replication_user, relay_master_log_file,

$ mysqldump -u username -p --all-database --single-transaction | gzip -f > dumpfile.gz
mysql> start slave;

b. Dump dữ liệu từ master

mysql> flush tables with read lock;
mysql> show master status;
$ mysqldump -u username -p --all-database --single-transaction | gzip -f > dumpfile.gz
mysql> unlock tables;

Bước 2: Cài đặt mysql phiên bản 5.6

$ /etc/init.d/mysql stop                 # stop mysql-5.0
$ cd /usr/local
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.13-linux-glibc2.5-x86_64.tar.gz/from/http://cdn.mysql.com/

$ tar xfz mysql-5.6.13-linux-glibc2.5-x86_64.tar.gz
$ mv mysql-5.6.13-linux-glibc2.5-x86_64 mysql-5.6.13

$ rm mysql
$ ln -sf mysql-5.6.13 mysql
$ cd mysql
$ chown -R mysql:mysql .

Bước 3: Khởi động mysql và import dữ liệu

$ cp /tmp/my.cnf /usr/local/mysql

$ cd /dbdata/data
$ rm -rf *
$ cd /usr/local/mysql
$ cd data            
$ ll 
$ cd ..
$ ./scripts/mysql_install_db --user=mysql
$ cp support-files/mysql.server /etc/init.d/mysql
$ /etc/init.d/mysql start
$ mysqladmin -u root password 'pass'


$ mv data data.bk
$ ln -sf /dbdata/data data

# import data file
$ mysql -u root -p < Backup file

Bước 4: Khởi động lại mysql.

$ /etc/init.d/mysql stop
$ /etc/init.d/mysql start

Bước 5: Cài đặt sao chép (replication)

$ mysql -u root -p
mysql> show slave status\G;   
....

mysql> change master to master_host='master ip',
         master_user='replication user name',
         master_password='password',
         master_log_file='mysql-bin.000003',
         master_log_pos=73;
  Query OK, 0 rows affected (0.03 sec)
mysql>
mysql> show slave status¥G
*************************** 1. row ***************************
             Slave_IO_State:
                Master_Host: master ip
                Master_User: replication user name
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.001378
        Read_Master_Log_Pos: 348578503
             Relay_Log_File: mysqld-relay-bin.000001
              Relay_Log_Pos: 4
      Relay_Master_Log_File: mysql-bin.001378
           Slave_IO_Running: No
          Slave_SQL_Running: No
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 348578503
            Relay_Log_Space: 98
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: NULL
1 row in set (0.00 sec)

mysql> start slave;

Bước 6: Kiểm tra cài đặt replication.

mysql> show slave status¥G
*************************** 1. row ***************************
             Slave_IO_State:
                Master_Host: master ip
                Master_User: Username
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.001378
        Read_Master_Log_Pos: 348578503
             Relay_Log_File: mysqld-relay-bin.000001
              Relay_Log_Pos: 4
      Relay_Master_Log_File: mysql-bin.001378
           Slave_IO_Running: No
          Slave_SQL_Running: No
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 348578503
            Relay_Log_Space: 98
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: NULL
1 row in set (0.00 sec)

mysql> start slave;

4. Các lỗi có thể có

Nếu làm mọi việc suôn sẻ, ta có thể hoàn thành thao tác nâng cấp ở bước 4. Tuy vậy tuỳ vào đặc tính dữ liệu, mà mọi việc có thể không suôn sẻ như vậy. Trong lần nâng cấp này, mình gặp 1 lỗi sau sau khi khởi động mysql.

2013-08-25 11:07:00 19807 [Note] Server socket created on IP: '0.0.0.0'.
02:07:00 UTC - mysqld got signal 11 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,
something is definitely wrong and this may fail.

key_buffer_size=134217728
read_buffer_size=2097152
max_used_connections=0
max_threads=100
thread_count=0
connection_count=0
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 542029 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

Thread pointer: 0xe57de70
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 7fffd70eced8 thread_stack 0x40000
/usr/local/mysql/bin/mysqld(my_print_stacktrace+0x35)[0x8fa385]
/usr/local/mysql/bin/mysqld(handle_fatal_signal+0x3e8)[0x66cfd8]
/lib64/libpthread.so.0[0x3a9300eb10]
/usr/local/mysql/bin/mysqld(_Z9get_fieldP11st_mem_rootP5Field+0x3c)[0x77b16c]
/usr/local/mysql/bin/mysqld[0x68c5bc]
/usr/local/mysql/bin/mysqld(_Z10acl_reloadP3THD+0x459)[0x68f059]
/usr/local/mysql/bin/mysqld(_Z8acl_initb+0x117)[0x6901c7]
/usr/local/mysql/bin/mysqld(_Z11mysqld_mainiPPc+0x543)[0x582e13]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x3a9241d994]
/usr/local/mysql/bin/mysqld(__gxx_personality_v0+0x2e1)[0x5779e9]

Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (0): is an invalid pointer
Connection ID (thread ID): 0
Status: NOT_KILLED

The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
130825 11:07:00 mysqld_safe Number of processes running now: 0
130825 11:07:00 mysqld_safe mysqld restarted
2013-08-25 11:07:01 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2013-08-25 11:07:01 19847 [Note] Plugin 'FEDERATED' is disabled.
2013-08-25 11:07:01 19847 [Note] InnoDB: The InnoDB memory heap is disabled
2013-08-25 11:07:01 19847 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2013-08-25 11:07:01 19847 [Note] InnoDB: Compressed tables use zlib 1.2.3
2013-08-25 11:07:01 19847 [Note] InnoDB: Using Linux native AIO
2013-08-25 11:07:01 19847 [Note] InnoDB: Not using CPU crc32 instructions
2013-08-25 11:07:01 19847 [Note] InnoDB: Initializing buffer pool, size = 512.0M
2013-08-25 11:07:01 19847 [Note] InnoDB: Completed initialization of buffer pool
2013-08-25 11:07:01 19847 [Note] InnoDB: Highest supported file format is Barracuda.
130825 11:07:09 mysqld_safe mysqld from pid file /usr/local/mysql/data/nl-dbdev-slave.pid ended

mysql khởi động gặp bug về bộ nhớ (segmentation fault) và bị kill bởi signal 11. Mysql liên tục khởi động và bị kill.

Để tránh trường hợp này, sau khi import dữ liệu ta nên chạy mysql_upgrade 1 lần để script này sửa các bảng trong trạng thái lỗi trước khi khởi động lại để tránh lỗi ở trên.

5. Tổng kết

Bài viết tóm tắt quy trình nâng cấp phiên bản mysql cũng như cách dump toàn bộ dữ liệu trong mysql cũng như lỗi có thể gặp phải + cách giải quyết. Hy vọng với tóm tắt này, bạn sẽ không bở ngỡ khi phải backup hay nâng cấp phiên bản cho mysql.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Bùi Hồng Hà

59 bài viết.
262 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
74 8
Bài viết tổng hợp cơ chế hoạt động của https Chút ít về chữ ký điện tử Chữ ký điện tử là cơ chế bao gồm 3 thuật toán: Thuật toán chọn một khóa...
Bùi Hồng Hà viết gần 3 năm trước
74 8
White
43 7
Giới thiệu Gần đây thấy bản thân chém gió rất nhiều về MapReduce, Hadoop v.v nhưng chưa thấy có bài viết nào tổng hợp + giải thích cụ thể về MapRe...
Bùi Hồng Hà viết 2 năm trước
43 7
White
33 0
Giới thiệu Google là một công ty dẫn đầu về phần mềm xử lý Big Data. Hầu hết các phần mềm xử lý dữ liệu như Hadoop đều có nguồn gốc ý tưởng từ Goo...
Bùi Hồng Hà viết 2 năm trước
33 0
Bài viết liên quan
Male avatar
19 0
Mysql innodb internal là một chủ đề khá sâu. Bản thân tôi cũng chưa bao quát hết. Bài viết này chỉ cung cấp một cái nhìn sơ lược. Để các bạn khôn...
manhdung viết hơn 2 năm trước
19 0
White
23 2
(Ảnh) Tiêu đề chỉ là câu khách :v, thực ra là có một vài điểm về mysql explain mà chắc chưa nhiều bạn biết, tớ cũng hay quên nên note lại cho nhớ ...
LinhPT viết hơn 2 năm trước
23 2
White
2 2
Đôi khi cài đặt MySQL trên Ubuntu hoặc trên các HĐH khác, trình cài đặt sẽ tự động set một mật khẩu ngẫu nhiên cho tài khoản root, nếu không để ý t...
Dang Viet Ha viết gần 2 năm trước
2 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
59 bài viết.
262 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!