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

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)”,以下图所示:python

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 来安装。
执行命令:
mysql

yum install epel-release –y

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

yum install cmake –y


为未来方便还能够把相关的也一并安装了:
nginx

yum install autoconf automake libtool


2.4安装可能依赖库
sql

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直接下载的仍是经过下载工具上传的),首先解压文件:
数据库

tar zxvf /root/mysql-boost-5.7.18.tar.gz
cd /root/mysql-5.7.18

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

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两个端口建立两个实例。
首先建立文件夹:
vim

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这个用户来运行,所以首先须要建立这个帐户:
tomcat

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的内容:
安全

[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的内容:

[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启动过程的错误信息的,不过悲催的是若是这个文件不存在,那么是会启动出错的,可又没有地方能够查看错误,所以须要提早建立好文件并设置权限。

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.1八、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

#!/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文件内容:

#!/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级别用户的帐号和密码,所以须要控制这个文件的查看和编辑权限。
须要给两个文件设置执行权限。

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/文件夹的用户和用户组属性:

chown –R mysql:mysql /usr/local/mysql-5.7.18


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

/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

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

/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 
其中关键的两句(每一个实例初始化都有相似一句):

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端口实例:

/usr/local/mysql-5.7.18/data/3306/mysql start


启动3307端口实例;

/usr/local/mysql-5.7.18/data/3307/mysql start


这是能够查看实例是否启动成功,若是启动成功相应的端口就会处于监听状态。

[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来查看错误日志:

[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端口对应的实例:

cd /usr/local/mysql-5.7.18
./bin/mysql -u root -p -S ./data/3306/mysql.sock

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

cd /usr/local/mysql-5.7.18
./bin/mysql -u root -p -S ./data/3307/mysql.sock

如下是登陆3306实例的过程:

[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的密码在初始化阶段时系统随机生成了,可见“执行初始化”一节中描述:

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实例对应的随机密码,初次登陆过程当中须要输入。

登陆成功后,若是再执行其它语句时会获得以下提示:

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


由于咱们没有改系统为root帐户生成的随机密码,在此以前是不能进行任何操做的,能够经过以下命令更改:

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]节点处:

[mysqld]
#
# * Basic Settings
#
server-id   = 1
log-bin= /usr/local/mysql-5.7.18/data/3306/mysql-bin

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

replicate-ignore-db = mysql


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

[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

在数据库中也能够查看:

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)

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

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语句查看:

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]节点处:

[mysqld]
#
# * Basic Settings
#
server-id   = 2

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

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

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

cd /usr/local/mysql-5.7.18
./bin/mysql -S ./data/3307/mysql.sock

而后执行如下语句:

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库以外的数据一致后才可启动同步,不然两个库中的就会不一致。
这里咱们来检查一下效果:
在主库中建立一个数据库,以下:

mysql> create database zhoufoxcn;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zhoufoxcn          |
+--------------------+
5 rows in set (0.01 sec)

而后在从库中查看数据库的状况:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zhoufoxcn          |
+--------------------+
5 rows in set (0.00 sec)

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

这时在主库查看状态:

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

在从库查看状态:

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随系统启动。

声明:本文首发于本人我的微信订阅号:zhoujinqiaoIT,其后会同时在本人的CSDN、51CTO及oschina三处博客发布,本人会负责在此四处答疑。

相关文章
相关标签/搜索