数据库服务器极度追求稳定,一旦数据库遭遇任何异常情况,将严重影响线上业务。保证数据库服务器的稳定性和性能是所有运维人员核心的工作之一。更换新服务器在所难免,如果快速的完成数据库服务器的迁移,遇到问题如何快速解决,考验着每一个辛苦的运维人员。

这里我们主要介绍下MySQL数据库服务器的迁移情况。

停服迁移

MySQL在不停服务器迁移数据库是有很多限制的,比如主库需要加上写入保护;当有写入请求的时候其实是会出错的。停服迁移最安全最方便;下面介绍一种直接全库拷贝的方式迁移整体数据库的方案。

假设有主A和从B两台MySQL服务器;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 比如我们主A的MySQL是下面的目录

# 1. 主A删除所有binlog,reset master; 删除同步:reset slave all;
# 关闭主数据库 rcmysql stop,会看到下面的目录
# suse423-13-55:/home/bmc/mysql-server #
total 1060904
-rw-rw---- 1 mysql mysql        56 Aug 13 12:52 auto.cnf
drwx------ 2 mysql mysql      4096 Sep 14 10:34 gozero
-rw-rw---- 1 mysql mysql 536870912 Jan  5 00:37 ib_logfile0
-rw-rw---- 1 mysql mysql 536870912 Aug 13 12:52 ib_logfile1
-rw-rw---- 1 mysql mysql  12582912 Jan  5 00:37 ibdata1
drwx------ 2 mysql mysql      4096 Aug 13 12:52 mysql
-rw-rw---- 1 mysql mysql       143 Jan  5 00:37 mysql-bin.000001
-rw-rw---- 1 mysql mysql        19 Jan  5 00:37 mysql-bin.index
-rw------- 1 root  root          3 Aug 13 12:52 mysql_upgrade_info
drwx------ 2 mysql mysql      4096 Aug 13 12:52 performance_schema
-rw-rw---- 1 mysql mysql       298 Jan  5 00:36 query-slow.log

# 2. 将上面的mysql-server整个目录 copy 到新服务器对应的 目录中。同时将主A的 /etc/my.cnf 
# 也拷贝到 新服务器的 /etc/my.cnf 下面。

# 3. 修改新服务器的my.cnf文件,填上适合自己的参数,比如下面这样
# add by cd.net on 2021-09-08
# -----------------------------------------------------------------------------
[mysqld]

datadir = /home/bmc/mysql-server

skip_name_resolve
skip_host_cache

max_connections=500
max_connect_errors=500

innodb_buffer_pool_size = 4G
innodb_file_format=Barracuda
innodb_file_per_table=ON

performance_schema=OFF
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

join_buffer_size = 2G
sort_buffer_size = 1G
read_rnd_buffer_size = 1G 

# 允许接收的数据包最大值
max_allowed_packet = 128M

# query slow
long_query_time = 1
slow-query-log = 1
slow-query-log-file = /home/bmc/mysql-server/query-slow.log

# replication(注意下面这个要改成新服务器的唯一标识)
server-id = 1965

log_bin = mysql-bin
binlog_format = mixed

binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%

# InnoDB在复制中最大的持久性和一致性,[每次commit都 write cache & flush disk]
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
# 事务日志文件大小
innodb_log_file_size = 512M


[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
log        = /var/log/mysqld_multi.log

!includedir /etc/my.cnf.d
# ++++++++++++++++++++++++++++++
# 需要注意,数据目录下 auto.cnf 文件中 UUID 需要做修改,否则两台服务器UUID一样,会报下面的错误
# 生成UUID的方法,可以修改 my.cnf 中的 datadir 目录,然后rcmysql start 你会得到一个新的UUID
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
  Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%
                Last_IO_Errno: 1593
                Last_IO_Error: Fatal error: The slave I/O thread stops because master and
slave have equal MySQL server ids; these ids must be different for replication to work.

# 4. 新主服务器A'加权限 chown -R mysql:mysql /home/bmc/mysql-server
# 之后启动试一试:rcmysql start
# 账号和密码不变,控制台进入后重置master: reset master;

# 5. 用同样的方法复制一份数据库到 新从服务器B'

# 6. 这样之后A'和B’其实是一模一样的数据库。接下来将他们配置成主从或者主主就好了。

不停服迁移

(完)