开发人员学Linux(6):CentOS7编译安装MySQL5.17.8多实例及主从复制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

1.前言
上一篇讲述了如何在CentOS7下编译安装Nginx-1.12.0并如何配置反向代理,本篇将讲述如何编译安装MySQL5.7.18并配置多实例。
2.准备
2.1下载MySQL5.7.18源码
注意最新版本的MySQL需要Boost才能编译安装,在MySQL提供的下载中有不带boost的源码,还有带boost的源码,如果下载不带boost的源码还需要再去下载boost源码,为省事起见,建议下载带boost的源码,下载地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.18.tar.gz (可直接使用wget下载)
注:可以打开网页来下载,网页地址为:https://dev.mysql.com/downloads/mysql/,当前最新版本为5.7.18,在“Select Operating System:”处选择“Source Code”,然后在图中选择“Generic Linux (Architecture Independent), Compressed TAR Archive Includes Boost Headers 5.7.18 58.8M (mysql-boost-5.7.18.tar.gz)”,如下图所示:

wKiom1k9VIrCGCVTAAIJkrL6OUE334.png-wh_50

wKiom1k9VIyz_Sh0AAH6-nz1kjk478.png-wh_50
 
2.2安装epel
EPEL的全称叫 Extra Packages for Enterprise linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。
在编译MySQL过程中需要一些依赖插件,安装epel后可直接通过yum install 来安装。
执行命令:

1
yum  install  epel-release –y

2.3安装cmake
不同于nginx使用make来编译和安装,MySQL使用CMake来编译和安装,安装命令:

1
yum  install  cmake –y


为将来方便还可以把相关的也一并安装了:

1
yum  install  autoconf automake libtool


2.4安装可能依赖库

1
2
3
4
5
yum  install  -y krb5 krb5-devel libidn libidn-devel openssl openssl-devel -y
yum  install  libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devdel -y
yum  install  zlib zlib-devel glibc glibc-devel glib2 glib2-devel  bzip2  bzip2 -devel -y
yum  install  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel -y
yum  install  perl-Data_dumper python-devel -y

3.编译及安装
3.1解压文件
假定mysql-boost-5.7.18.tar.gz文件位于/root/目录下(不管是通过wget直接下载的还是通过下载工具上传的),首先解压文件:

1
2
tar  zxvf  /root/mysql-boost-5 .7.18. tar .gz
cd  /root/mysql-5 .7.18

3.2配置、编译及安装
首先进行参数配置,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cmake \
-DWITH_BOOST=boost \
-DCMAKE_INSTALL_PREFIX= /usr/local/mysql-5 .7.18 \
-DMYSQL_DATADIR= /usr/local/mysql-5 .7.18 /data  \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
-DMYSQL_USER=mysql \
-DWITH_ZLIB=bundled \
-DWITH_READLINE=1 \
-DWITH_FAST_MUTEXES=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_DEBUG=0 \
-DWITH_SSL=system

这里要说明几点:
(1)当命令或参数过长时,为了便于直观显示,可以在其后加上”\”,当然”\”与正常命令之间需要有空格;
(2) -DWITH_BOOST=boost 指定boost类库的位置;
(3) -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.18 指定安装位置;
在上述配置过程中可能会有出错信息,根据出错信息调整响应参数或者安装缺失的类库,直到提示可以安装为止。
然后执行make进行编译,编译过程中没有错误的再执行make install安装,由于源代码体积有点大,编译耗费的时间比较长,在本人2G内存、4核的虚拟机上编译时间超过半小时以上。
安装成功之后,在/usr/local/mysql-5.7.18下就是安装后的文件目录。

4.数据库初始化
4.1创建my.cnf文件
my.cnf文件是MySQL的配置文件,在MySQL启动过程中会读取里面的配置信息。
在本篇中不满足于单实例的配置,本篇将利用3306和3307两个端口创建两个实例。
首先创建文件夹:

1
2
mkdir  –p  /usr/local/mysql-5 .7.18 /data/3306/data
mkdir  –p  /usr/local/mysql-5 .7.18 /data/3307/data

/usr/local/mysql-5.7.18/data/3306文件夹用于存放监听3306端口实例的相关配置信息、执行脚本和数据,/usr/local/mysql-5.7.18/data/3307文件夹用于存放监听3307端口实例的相关配置信息、执行脚本和数据。
因为mysql数据库将以nginx这个用户来运行,因此首先需要创建这个账户:

1
useradd  mysql -s  /sbin/nologin  –M


分别在/usr/local/mysql-5.7.18/data/3306和/usr/local/mysql-5.7.18/data/3307创建my.cnf文件,可以使用vim创建并粘贴内容。
/usr/local/mysql-5.7.18/data/3306/my.cnf的内容:

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
[client]
port        = 3306
socket        =  /usr/local/mysql-5 .7.18 /data/3306/mysql .sock
[mysqld_safe]
log-error        =  /usr/local/mysql-5 .7.18 /data/3306/mysql .err
pid- file         /usr/local/mysql-5 .7.18 /data/3306/mysql .pid
[mysqld]
#
# * Basic Settings
#
server- id    = 1
log-bin=  /usr/local/mysql-5 .7.18 /data/3306/mysql-bin
user        = mysql
pid- file     /usr/local/mysql-5 .7.18 /data/3306/mysql .pid
socket        =  /usr/local/mysql-5 .7.18 /data/3306/mysql .sock
port        = 3306
basedir        =  /usr/local/mysql-5 .7.18
datadir        =  /usr/local/mysql-5 .7.18 /data/3306/data
tmpdir        =  /tmp
open_files_limit=1024
external-locking =  false
character- set -server=utf8
default-storage-engine=MyISAM
bind-address        = 0.0.0.0
max_allowed_packet    = 8M
thread_stack        = 192K
thread_cache_size       = 8
max_connections        = 800
max_connect_errors    = 300
#table_cache            = 64
#thread_concurrency     = 10
query_cache_limit    = 1M
query_cache_size        = 2M
join_buffer_size=1M
sort_buffer_size=1M
long_query_time = 1
relay-log =  /usr/local/mysql-5 .7.18 /data/3306/relay-bin
relay-log-info- file  = /usr/local/mysql-5 .7.18 /data/3306/relay-log .info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
key_buffer_size=16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors =1032,1062
replicate-ignore-db = mysql
#innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:12M:autoextend
#innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
#innodb_log_files_in_groups = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

/usr/local/mysql-5.7.18/data/3307/my.cnf的内容:

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
[client]
port        = 3307
socket        =  /usr/local/mysql-5 .7.18 /data/3307/mysql .sock
[mysqld_safe]
log-error        =  /usr/local/mysql-5 .7.18 /data/3307/mysql .err
pid- file         /usr/local/mysql-5 .7.18 /data/3307/mysql .pid
[mysqld]
#
# * Basic Settings
#
server- id    = 2
user        = mysql
pid- file     /usr/local/mysql-5 .7.18 /data/3307/mysql .pid
socket        =  /usr/local/mysql-5 .7.18 /data/3307/mysql .sock
port        = 3307
basedir        =  /usr/local/mysql-5 .7.18
datadir        =  /usr/local/mysql-5 .7.18 /data/3307/data
tmpdir        =  /tmp
open_files_limit=1024
external-locking =  false
character- set -server=utf8
default-storage-engine=MyISAM
bind-address        = 0.0.0.0
max_allowed_packet    = 8M
thread_stack        = 192K
thread_cache_size       = 8
max_connections        = 800
max_connect_errors    = 300
#table_cache            = 64
#thread_concurrency     = 10
query_cache_limit    = 1M
query_cache_size        = 2M
join_buffer_size=1M
sort_buffer_size=1M
long_query_time = 1
relay-log =  /usr/local/mysql-5 .7.18 /data/3307/relay-bin
relay-log-info- file  = /usr/local/mysql-5 .7.18 /data/3307/relay-log .info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
key_buffer_size=16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors =1032,1062
replicate-ignore-db = mysql
#innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:12M:autoextend
#innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
#innodb_log_files_in_groups = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

注:在3306及3307配置中都提到了mysql.err这个文件,这个文件是用来记录MySQL启动过程的错误信息的,不过悲催的是如果这个文件不存在,那么是会启动出错的,可又没有地方可以查看错误,因此需要提前创建好文件并设置权限。

1
2
3
4
touch  /usr/local/mysql-5 .7.18 /data/3306/mysql .err
touch  /usr/local/mysql-5 .7.18 /data/3307/mysql .err
chmod  766  /usr/local/mysql-5 .7.18 /data/3306/mysql .err
chmod  766  /usr/local/mysql-5 .7.18 /data/3307/mysql .err

注:如果嫌每次输入完整的文件路径麻烦可以切换到程序的安装目录,甚至还可以创建软链接,所谓的软链接有点类似于Windows下的快捷方式,如ln –s /usr/local/mysql-5.7.18 /usr/local/mysql就是创建了mysql-5.7.18的软链接,甚至如果你喜欢,还可以在用户根目录下创建软链接,如:ln –s /usr/local/mysql-5.7.18 /root /mysql。
通过命令查看,如下图所示是在SSH客户端中的效果:
wKiom1k9VU-A87sxAAB4fOhGxo0207.png-wh_50 
上面mysql,nginx及tomcat都是创建的软链接(文件属性的第一个字符是”l”表明是软链接),其对应的真实路径分别为当前路径下的mysql-5.7.18、nginx-1.12.0及apache-tomcat-8.5.15目录。
4.2创建MySQL的启动文件
分别在/usr/local/mysql-5.7.18/data/3306和/usr/local/mysql-5.7.18/data/3307创建mysql文件。可用vim来创建文件,这个文件是用来启动MySQL实例的,所以在创建完成不要忘记chmod 755设置。
/usr/local/mysql-5.7.18/data/3306/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
#!/bin/sh
port=3306
mysql_user= "root"
mysql_pwd= "mypassword"
cmd_path= "/usr/local/mysql-5.7.18/bin"
mysql_sock= "/usr/local/mysql-5.7.18/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
       printf  "Starting MySQL...\n"
       /bin/sh  ${cmd_path} /mysqld_safe  --defaults- file = /usr/local/mysql-5 .7.18 /data/ ${port} /my .cnf 2>&1 >  /dev/null  &
     else
       printf  "MySQL is running...\n"
       exit
     fi
}
#stop function
function_stop_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
        printf  "MySQL is stopped...\n"
        exit
     else
        printf  "Stoping MySQL...\n"
        ${cmd_path} /mysqladmin  -u ${mysql_user} -p${mysql_pwd} -S  /usr/local/mysql-5 .7.18 /data/ ${port} /mysql .sock  shutdown
    fi
}
#restart function
function_restart_mysql()
{
     printf  "Restarting MySQL...\n"
     function_stop_mysql
     sleep  2
     function_start_mysql
}
case  $1  in
start)
     function_start_mysql
;;
stop)
     function_stop_mysql
;;
restart)
     function_restart_mysql
;;
*)
     printf  "Usage: /usr/local/mysql-5.7.18/data/${port}/mysql {start|stop|restart}\n"
esac

/usr/local/mysql-5.7.18/data/3307/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
#!/bin/sh
port=3307
mysql_user= "root"
mysql_pwd= "mypassword"
cmd_path= "/usr/local/mysql-5.7.18/bin"
mysql_sock= "/usr/local/mysql-5.7.18/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
       printf  "Starting MySQL...\n"
       /bin/sh  ${cmd_path} /mysqld_safe  --defaults- file = /usr/local/mysql-5 .7.18 /data/ ${port} /my .cnf 2>&1 >  /dev/null  &
     else
       printf  "MySQL is running...\n"
       exit
     fi
}
#stop function
function_stop_mysql()
{
     if  [ ! -e  "$mysql_sock"  ]; then
        printf  "MySQL is stopped...\n"
        exit
     else
        printf  "Stoping MySQL...\n"
        ${cmd_path} /mysqladmin  -u ${mysql_user} -p${mysql_pwd} -S  /usr/local/mysql-5 .7.18 /data/ ${port} /mysql .sock  shutdown
    fi
}
#restart function
function_restart_mysql()
{
     printf  "Restarting MySQL...\n"
     function_stop_mysql
     sleep  2
     function_start_mysql
}
case  $1  in
start)
     function_start_mysql
;;
stop)
     function_stop_mysql
;;
restart)
     function_restart_mysql
;;
*)
     printf  "Usage: /usr/local/mysql-5.7.18/data/${port}/mysql {start|stop|restart}\n"
esac

注意:
上述启动文件中关闭实例没有采用kill进程的办法,而是使用mysqladmin shutdown的方法,这个方法需要root级别用户的账号和密码,因此需要控制这个文件的查看和编辑权限。 
需要给两个文件设置执行权限。

1
2
chmod  755  /usr/local/mysql-5 .7.18 /data/3306/mysql
chmod  755  /usr/local/mysql-5 .7.18 /data/3307/mysql

此外,因为MySQL的两个实例均以MySQL用户运行,为保证有足够的权限,设置/usr/local/mysql-5.7.18/文件夹的用户和用户组属性:

1
chown  –R mysql:mysql  /usr/local/mysql-5 .7.18


4.3执行初始化
网上有很多例子讲解MySQL初始化都是利用MySQL安装目录下的bin目录中的mysql_install_db来执行,但是这个官方不建议的,官方建议使用mysqld来初始化。
下面的脚本可以执行但不建议使用(且本人发现执行后不知道root用户默认密码):

1
2
3
4
5
6
7
8
/usr/local/mysql-5 .7.18 /bin/mysql_install_db  \
--basedir= /usr/local/mysql-5 .7.18 \
--datadir= /usr/local/mysql-5 .7.18 /data/3306/data  \
--user=mysql
/usr/local/mysql-5 .7.18 /bin/mysql_install_db  \
--basedir= /usr/local/mysql-5 .7.18 \
--datadir= /usr/local/mysql-5 .7.18 /data/3307/data  \
--user=mysql

下面的脚本是官方建议的:

1
2
3
4
5
6
7
8
/usr/local/mysql-5 .7.18 /bin/mysqld  --initialize \
--basedir= /usr/local/mysql-5 .7.18 \
--datadir= /usr/local/mysql-5 .7.18 /data/3306/data  \
--user=mysql
/usr/local/mysql-5 .7.18 /bin/mysqld  --initialize \
--basedir= /usr/local/mysql-5 .7.18 \
--datadir= /usr/local/mysql-5 .7.18 /data/3307/data  \
--user=mysql

上面的脚本如果执行成功,最后一句里有root用户的初始密码,在本人执行上述两条命令时得到结果如下:
wKiom1k9VZyTZl_xAAFK0GH521E708.png-wh_50 
其中关键的两句(每个实例初始化都有类似一句):

1
2
2017-06-09T13:45:09.590690Z 1 [Note] A temporary password is generated  for  root@localhost: Gdl<nv>R7&+w
2017-06-09T13:46:48.721250Z 1 [Note] A temporary password is generated  for  root@localhost: Z>B #5IfIFAfj

上述密码是随机的,请记住一会登录系统后更改临时密码。
4.4启动MySQL实例和登录
4.4.1启动实例
启动3306端口实例:

1
/usr/local/mysql-5 .7.18 /data/3306/mysql  start


启动3307端口实例;

1
/usr/local/mysql-5 .7.18 /data/3307/mysql  start


这是可以查看实例是否启动成功,如果启动成功相应的端口就会处于监听状态。

1
2
3
4
5
6
7
[root@localhost ~] # /usr/local/mysql-5.7.18/data/3306/mysql start
Starting MySQL...
[root@localhost ~] # /usr/local/mysql-5.7.18/data/3307/mysql start
Starting MySQL...
[root@localhost ~] # netstat -lntp | grep 330
tcp        0      0 0.0.0.0:3307            0.0.0.0:*               LISTEN      4480 /mysqld         
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      3817 /mysqld

     
从执行结果来看,3306和3307两个端口对应的MySQL实例均已启动。
如果启动不成功,可以通过相应的错误日志来排除错误,如下就是用tail来查看错误日志:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # tail /usr/local/mysql-5.7.18/data/3306/mysql.err
2017-06-10T14:41:51.366238Z 0 [Warning]  'db'  entry  'sys mysql.sys@localhost'  ignored  in  --skip-name-resolve mode.
2017-06-10T14:41:51.366625Z 0 [Warning]  'proxies_priv'  entry  '@ root@localhost'  ignored  in  --skip-name-resolve mode.
2017-06-10T14:41:51.371787Z 0 [Warning]  'tables_priv'  entry  'sys_config mysql.sys@localhost'  ignored  in  --skip-name-resolve mode.
2017-06-10T14:41:51.416687Z 0 [Note] Event Scheduler: Loaded 0 events
2017-06-10T14:41:51.416855Z 0 [Note]  /usr/local/mysql-5 .7.18 /bin/mysqld : ready  for  connections.
Version:  '5.7.18-log'   socket:  '/usr/local/mysql-5.7.18/data/3306/mysql.sock'   port: 3306  Source distribution
2017-06-10T14:41:51.416862Z 0 [Note] Executing  'SELECT * FROM INFORMATION_SCHEMA.TABLES;'  to get a list of tables using the deprecated partition engine. You may use the startup option  '--disable-partition-engine-check'  to skip this check. 
2017-06-10T14:41:51.416864Z 0 [Note] Beginning of list of non-natively partitioned tables
2017-06-10T14:41:51.473660Z 0 [Note] End of list of non-natively partitioned tables
2017-06-10T14:42:07.539386Z 3 [Note] Start binlog_dump to master_thread_id(3) slave_server(2), pos(mysql-bin.000001, 2654)

4.4.2登录实例
如果是单实例可以通过mysql –u user –p来登录,但这里有了两个实例,所以登录方式有些区别。
登录到3306端口对应的实例:

1
2
cd  /usr/local/mysql-5 .7.18
. /bin/mysql  -u root -p -S . /data/3306/mysql .sock

登录到3307端口对应的实例:

1
2
cd  /usr/local/mysql-5 .7.18
. /bin/mysql  -u root -p -S . /data/3307/mysql .sock

以下是登录3306实例的过程:

1
2
3
4
5
6
[root@localhost ~] # cd /usr/local/mysql-5.7.18
[root@localhost mysql-5.7.18] # ./bin/mysql -u root -p -S ./data/3306/mysql.sock
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection  id  is 4
Server version: 5.7.18

在此过程中需要输入root的密码,root的密码在初始化阶段时系统随机生成了,可见“执行初始化”一节中描述:

1
2
2017-06-09T13:45:09.590690Z 1 [Note] A temporary password is generated  for  root@localhost: Gdl<nv>R7&+w
2017-06-09T13:46:48.721250Z 1 [Note] A temporary password is generated  for  root@localhost: Z>B #5IfIFAfj

其中Gdl<nv>R7&+w和Z>B#5IfIFAfj分别是3306和3307实例对应的随机密码,初次登录过程中需要输入。

登录成功后,如果再执行其它语句时会得到如下提示:

1
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.


因为我们没有改系统为root账户生成的随机密码,在此之前是不能进行任何操作的,可以通过如下命令更改:

1
2
mysql>  SET  PASSWORD  PASSWORD ( 'your_password' ); 
Query OK, 0  rows  affected (0.03 sec)

在实际执行过程中请将your_password更改为自己的密码。改完之后记得改3306和3307两个启动文件中的用户密码哦,否则stop命令不会生效的。
至此,MySQL数据库已完成初始化和初步配置。在实际过程中由于root用户的权限过大、且默认情况下只能在服务器上登录,为了安全一般会创建其它较小权限的用户,在这里为了演示方便省却了这个操作。
5.设置MySQL主从同步
主从同步,也称master-slave,是开发过程中常见的提高程序性能的办法。通常情况下在主数据库服务器写入数据,查询数据的时候是在从服务器,主从服务器之间通过同步机制来保持一致,虽然主从数据库的一致性是存在一定时间差的,但因为这个时间差很小所以在一些对时间不是非常敏感的业务场景下被认为是实时一致的。在大多数主流数据库中都是可以通过配置来实现主从同步、读写分离的。
这里就以刚刚配置起来的两个数据实例来演示如何实现主从同步的,步骤有如下:
(1)主数据库实例设置server-id和开启bin-log;
(2)主数据库实例创建用于同步的账号;
(3)从数据库实例设置server-id;
(4)从数据库实例配置同步参数;
(5)从数据库实例启动同步开关。
5.1主数据库实例设置server-id和开启bin-log
其实在上面的3306的配置文件里已经配置了server-id和bin-log,就在/usr/local/mysql-5.7.18/data/3306/my.cnf文件的[mysqld]节点处:

1
2
3
4
5
6
[mysqld]
#
# * Basic Settings
#
server- id    = 1
log-bin=  /usr/local/mysql-5 .7.18 /data/3306/mysql-bin

另外还需要注意的是在这个my.cnf配置文件中还有一句:

1
replicate-ignore-db = mysql


它的意思是在进行主从同步时忽略mysql这个库,因为mysql库主要存放账号及授权信息的,不同数据库实例账号和授权信息不同的可能性极大,因此没有必要同步这个库。
通过如下命令可以快速查看是否已经正确配置:

1
2
3
[root@localhost ~] # egrep "server-id|log-bin" /usr/local/mysql-5.7.18/data/3306/my.cnf
server- id    = 1
log-bin         =  /usr/local/mysql-5 .7.18 /data/3306/mysql-bin

在数据库中也可以查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show variables  like  "server_id" ;
+ ---------------+-------+
| Variable_name | Value |
+ ---------------+-------+
| server_id     | 1     |
+ ---------------+-------+
1 row  in  set  (0.00 sec)
mysql> show variables  like  "log_bin" ;
+ ---------------+-------+
| Variable_name | Value |
+ ---------------+-------+
| log_bin       |  ON     |
+ ---------------+-------+
1 row  in  set  (0.00 sec)

同时,这里也查看一下主数据库的状态:

1
2
3
4
5
6
7
8
9
10
mysql> show master status \G;
*************************** 1. row ***************************
              File: mysql-bin.000003
          Position: 154
      Binlog_Do_DB: 
  Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row  in  set  (0.00 sec)
ERROR: 
No  query specified

这里:File和Position的值是两个很重要的参数,这是从数据库下次同步时的起始位置。
5.2主数据库实例创建用于同步的账号
在主数据库创建一个replication账号用于从主库同步数据到从库,创建replication账号的语句如下:
grant replication slave on *.* to 'replication'@'%' identified by 'your_password';flush privileges;
在实际执行时请将your_password改为自己的密码,执行这个SQL语句后就会在mysql库中的user表中创建一个名为replication的用户,可以通过SQL语句查看:

1
2
3
4
5
6
7
mysql> show grants  for  "replication" @ "%" ;
+ -----------------------------------------------------+
| Grants  for  replication@%                            |
+ -----------------------------------------------------+
GRANT  REPLICATION SLAVE  ON  *.*  TO  'replication' @ '%'  |
+ -----------------------------------------------------+
1 row  in  set  (0.00 sec)

5.3从数据库实例设置server-id
同样,其实在上面的3307的配置文件里已经配置了server-id和bin-log,就在/usr/local/mysql-5.7.18/data/3307/my.cnf文件的[mysqld]节点处:

1
2
3
4
5
[mysqld]
#
# * Basic Settings
#
server-id   = 2

注意:在一个主从关系群中server-id是唯一的,另外在由于从数据库不向其它库同步数据,因此没有开启bin-log。这里也通过egrep查看一下:

1
2
[root@localhost ~] # egrep "server-id|log-bin" /usr/local/mysql-5.7.18/data/3307/my.cnf
server- id    = 1

5.4从数据库实例配置同步参数
登录3307端口对应的实例:

1
2
cd  /usr/local/mysql-5 .7.18
. /bin/mysql  -S . /data/3307/mysql .sock

然后执行以下语句:

1
2
3
4
5
6
7
CHANGE MASTER  TO  \
MASTER_HOST= '127.0.0.1' , \
MASTER_PORT=3306, \
MASTER_USER= 'replication' , \
MASTER_PASSWORD= 'your_password' , \
MASTER_LOG_FILE= 'mysql-bin.000003' , \
MASTER_LOG_POS=154;

说明:
MASTER_HOST为主服务器IP或主机名;
MASTER_PORT为主服务器端口;
MASTER_USER为主服务器上用于同步的数据库账户名;
MASTER_PASSWORD为主服务器上用于同步的数据库账户对应的密码;
MASTER_LOG_FILE为当前bin-log日志文件名;
MASTER_LOG_POS为当前偏移量;
其中MASTER_LOG_FILE和MASTER_LOG_POS可以在主数据库上执行” show master status \G;”SQL语句来获得,见本文“主数据库实例设置server-id和开启bin-log”一节。
5.5从数据库实例启动同步开关
登录从数据库执行”start slave”即可。
在本篇中由于连个数据库都是刚刚初始化的,所以数据都是一致的。在实际情况中,需要先将两个数据库实例中的除mysql库之外的数据一致后才可启动同步,否则两个库中的就会不一致。
这里我们来检查一下效果:
在主库中创建一个数据库,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql>  create  database  zhoufoxcn;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zhoufoxcn          |
+ --------------------+
rows  in  set  (0.01 sec)

然后在从库中查看数据库的情况:

1
2
3
4
5
6
7
8
9
10
11
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zhoufoxcn          |
+ --------------------+
rows  in  set  (0.00 sec)

可见主库的数据被自动同步到从库了,这时再在主库中删除zhoufoxcn这个库,可以看到从库中也自动删掉了。

这时在主库查看状态:

1
2
3
4
5
6
7
8
9
10
mysql> show master status \G;
*************************** 1. row ***************************
              File: mysql-bin.000003
          Position: 488
      Binlog_Do_DB: 
  Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row  in  set  (0.00 sec)
ERROR: 
No  query specified

在从库查看状态:

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
mysql> show slave status \G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting  for  master  to  send event
                   Master_Host: 127.0.0.1
                   Master_User: replication
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000003
           Read_Master_Log_Pos: 488
                Relay_Log_File: relay-bin.000008
                 Relay_Log_Pos: 701
         Relay_Master_Log_File: mysql-bin.000003
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB: 
           Replicate_Ignore_DB: mysql
            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: 488
               Relay_Log_Space: 1115
               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: 0
Master_SSL_Verify_Server_Cert:  No
                 Last_IO_Errno: 0
                 Last_IO_Error: 
                Last_SQL_Errno: 0
                Last_SQL_Error: 
   Replicate_Ignore_Server_Ids: 
              Master_Server_Id: 1
                   Master_UUID: da584607-4d19-11e7-8903-080027f376f5
              Master_Info_File: /usr/ local /mysql-5.7.18/data/3307/data/master.info
                     SQL_Delay: 0
           SQL_Remaining_Delay:  NULL
       Slave_SQL_Running_State: Slave has  read  all  relay log; waiting  for  more updates
            Master_Retry_Count: 86400
                   Master_Bind: 
       Last_IO_Error_Timestamp: 
      Last_SQL_Error_Timestamp: 
                Master_SSL_Crl: 
            Master_SSL_Crlpath: 
            Retrieved_Gtid_Set: 
             Executed_Gtid_Set: 
                 Auto_Position: 0
          Replicate_Rewrite_DB: 
                  Channel_Name: 
            Master_TLS_Version: 
1 row  in  set  (0.00 sec)
ERROR: 
No  query specified

可以看出通过配置,两台数据库能够自动同步数据了。

6.总结
本篇主要讲述了如何从MySQL官方网站下载源代码通过编译和安装,然后配置成多个实例运行,在最后还讲解了如何配置MySQL数据库主从同步。在实际情况中,可能有人在用MariaDB了,这是原MySQL开发人员在Oracle收购了Sun之后(Sun收购了MySQL),担心Oracle不再继续开源MySQL而开发的一套开源数据系统,它们有很多相似性,在本篇没有涉及。另外,本篇没有涉及的还有通过mysqld_multi.server来设置将MySQL随系统启动。




























本文转自周金桥51CTO博客,原文链接: http://blog.51cto.com/zhoufoxcn/1934319,如需转载请自行联系原作者


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
115 1
|
3天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
47 24
|
16天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
2月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
111 1
MySQL主从复制原理和使用
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
94 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
45 3
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。通过具体案例,读者可以了解如何准备环境、下载源码、编译安装、配置服务及登录 MySQL。编译源码安装虽然复杂,但提供了更高的定制性和灵活性,适用于需要高度定制的场景。
102 3
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。
本文介绍了在 CentOS 7 中通过编译源码安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。内容涵盖准备工作、下载源码、编译安装、配置服务、登录设置及实践心得,帮助读者根据需求选择最适合的安装方法。
86 2
|
1月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
110 3
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
137 2
下一篇
DataWorks