美文网首页Linux科技
编译安装MySQL主从(法1)

编译安装MySQL主从(法1)

作者: Miracle001 | 来源:发表于2018-08-21 17:55 被阅读0次

安装所需包

耗时长,所需空间也大

/root/目录下进行

yum -y groupinstall 'Development Tools'
yum -y install cmake autoconf automake libtool 

依赖的库
yum -y install krb5 krb5-devel libidn libidn-devel openssl openssl-devel 
yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devdel
yum -y install zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel
yum -y install ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel

下载包perl-Data-Dumper-2.145-3.el7.x86_64.rpm
http://rpm.pbone.net/index.php3?stat=3&search=perl-Data-Dumper&srodzaj=3
rz  上传此包perl-Data-Dumper-2.145-3.el7.x86_64.rpm
rpm -ivh perl-Data-Dumper-2.145-3.el7.x86_64.rpm

下载mysql-boost-5.7.23.tar.gz
https://dev.mysql.com/downloads/mysql/5.7.html#downloads

源码 mysql-boost-5.7.23.tar.gz

编译安装

tar -xzvf mysql-boost-5.7.23.tar.gz
cd mysql-boost-5.7.23

记得编译时,把从库也编译了,时间有点长

参数配置
cmake \
-DWITH_BOOST=boost \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.23 \
-DMYSQL_DATADIR=/usr/local/mysql-5.7.23/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


编译和安装
make && make install


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

1

数据库初始化

创建my.cnf文件

my.cnf文件是MySQL的配置文件,在MySQL启动过程中会读取里面的配置信息。
利用3306和3307两个端口创建两个实例

mkdir -p /usr/local/mysql-5.7.23/data/3306/data
mkdir -p /usr/local/mysql-5.7.23/data/3307/data

useradd mysql -s /sbin/nologin -M

/usr/local/mysql-5.7.23/data/3306文件夹用于存放监听3306端口实例的相关配置信息、执行脚本和数据
/usr/local/mysql-5.7.23/data/3307文件夹用于存放监听3307端口实例的相关配置信息、执行脚本和数据


因为mysql数据库将以nginx这个用户来运行,因此首先需要创建这个账户:
此处没有那么多考虑,只是创建mysql用户
useradd mysql -s /sbin/nologin –M

后期'repl'@'192.168.%.%',从库不能复制;只能'repl'@'%'才可以;
可能是/sbin/nologin导致?
以下两个命令可能会解决问题,待查
groupadd mysql
useradd -r -g mysql mysql


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

/usr/local/mysql-5.7.23/data/3306/my.cnf的内容

vim /usr/local/mysql-5.7.23/data/3306/my.cnf

[client]
port        = 3306
socket        = /usr/local/mysql-5.7.23/data/3306/mysql.sock
 
[mysqld_safe]
log-error        = /usr/local/mysql-5.7.23/data/3306/mysql.err
pid-file        = /usr/local/mysql-5.7.23/data/3306/mysql.pid
 
[mysqld]
#
# * Basic Settings
#
server-id   = 1
log-bin= /usr/local/mysql-5.7.23/data/3306/mysql-bin
user        = mysql
pid-file    = /usr/local/mysql-5.7.23/data/3306/mysql.pid
socket        = /usr/local/mysql-5.7.23/data/3306/mysql.sock
port        = 3306
basedir        = /usr/local/mysql-5.7.23
datadir        = /usr/local/mysql-5.7.23/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.23/data/3306/relay-bin
relay-log-info-file =/usr/local/mysql-5.7.23/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.23/data/3307/my.cnf的内容

vim /usr/local/mysql-5.7.23/data/3307/my.cnf
[client]
port        = 3307
socket        = /usr/local/mysql-5.7.23/data/3307/mysql.sock
 
[mysqld_safe]
log-error        = /usr/local/mysql-5.7.23/data/3307/mysql.err
pid-file        = /usr/local/mysql-5.7.23/data/3307/mysql.pid
 
[mysqld]
#
# * Basic Settings
#
server-id   = 2
user        = mysql
pid-file    = /usr/local/mysql-5.7.23/data/3307/mysql.pid
socket        = /usr/local/mysql-5.7.23/data/3307/mysql.sock
port        = 3307
basedir        = /usr/local/mysql-5.7.23
datadir        = /usr/local/mysql-5.7.23/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.23/data/3307/relay-bin
relay-log-info-file =/usr/local/mysql-5.7.23/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.23/data/3306/mysql.err
touch /usr/local/mysql-5.7.23/data/3307/mysql.err
chmod 766 /usr/local/mysql-5.7.23/data/3306/mysql.err
chmod 766 /usr/local/mysql-5.7.23/data/3307/mysql.err

创建MySQL的启动文件

分别在/usr/local/mysql-5.7.23/data/3306和/usr/local/mysql-5.7.23/data/3307创建mysql文件。
可用vim来创建文件,这个文件是用来启动MySQL实例的,所以在创建完成不要忘记chmod 755设置。

vim /usr/local/mysql-5.7.23/data/3306/mysql

#!/bin/sh
port=3306
mysql_user="root"
mysql_pwd="qianggedu"
cmd_path="/usr/local/mysql-5.7.23/bin"
mysql_sock="/usr/local/mysql-5.7.23/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.23/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.23/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.23/data/${port}/mysql {start|stop|restart}\n"
esac


------------------------------------------------------------------------------------

vim /usr/local/mysql-5.7.23/data/3307/mysql

#!/bin/sh
port=3307
mysql_user="root"
mysql_pwd="qianggedu"
cmd_path="/usr/local/mysql-5.7.23/bin"
mysql_sock="/usr/local/mysql-5.7.23/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.23/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.23/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.23/data/${port}/mysql {start|stop|restart}\n"
esac





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

chmod 755 /usr/local/mysql-5.7.23/data/3306/mysql
chmod 755 /usr/local/mysql-5.7.23/data/3307/mysql


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

chown -R mysql:mysql /usr/local/mysql-5.7.23


执行初始化:
/usr/local/mysql-5.7.23/bin/mysqld --initialize \
--basedir=/usr/local/mysql-5.7.23 \
--datadir=/usr/local/mysql-5.7.23/data/3306/data \
--user=mysql
 
/usr/local/mysql-5.7.23/bin/mysqld --initialize \
--basedir=/usr/local/mysql-5.7.23 \
--datadir=/usr/local/mysql-5.7.23/data/3307/data \
--user=mysql




初始化结果,随机密码生成
启动MySQL实例和登录
启动实例:
启动3306端口实例:
/usr/local/mysql-5.7.23/data/3306/mysql start

启动3307端口实例;
/usr/local/mysql-5.7.23/data/3307/mysql start



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

tail /usr/local/mysql-5.7.23/data/3306/mysql.err

查看错误日志
登录实例
如果是单实例可以通过mysql -u user -p来登录,但这里有了两个实例,所以登录方式有些区别。

登录到3306端口对应的实例
/usr/local/mysql-5.7.23/bin/mysql -uroot -p'9gYtk5xvTx%k' -S /usr/local/mysql-5.7.23/data/3306/mysql.sock

登录到3307端口对应的实例:
cd /usr/local/mysql-5.7.23
./bin/mysql -u root -p'...' -S ./data/3307/mysql.sock


登陆
登陆成功后,修改密码
set password for 'root'@localhost = password('qianggedu');
flush privileges;
quit;

验证密码是否OK
/usr/local/mysql-5.7.23/bin/mysql -uroot -p -S /usr/local/mysql-5.7.23/data/3306/mysql.sock
输入密码,成功登陆,OK

#改完之后记得改3306和3307两个启动文件中的用户密码,否则stop命令不会生效的。
#vim /usr/local/mysql-5.7.23/data/3306/mysql
#mysql_pwd="mypassword"  改为mysql_pwd="qianggedu"


至此,MySQL数据库已完成初始化和初步配置。
在实际过程中由于root用户的权限过大、且默认情况下只能在服务器上登录。
为了安全一般会创建其它较小权限的用户,在这里为了演示方便省却了这个操作。

设置MySQL主从

master

vim /usr/local/mysql-5.7.23/data/3306/my.cnf
server-id   = 1
log-bin= /usr/local/mysql-5.7.23/data/3306/mysql-bin

注意的是在这个my.cnf配置文件中还有一句:replicate-ignore-db = mysql
意思是在进行主从同步时忽略mysql这个库,
因为mysql库主要存放账号及授权信息的,不同数据库实例账号和授权信息不同的可能性极大,因此没有必要同步这个库。

快速查看是否已经正确配置
egrep "server-id|log-bin" /usr/local/mysql-5.7.23/data/3306/my.cnf

进入数据库:
/usr/local/mysql-5.7.23/bin/mysql -uroot -p -S /usr/local/mysql-5.7.23/data/3306/mysql.sock
show variables like "server_id";
show variables like "log_bin";
show master status \G;
File和Position的值是两个很重要的参数,这是从数据库下次同步时的起始位置

主从同步用户
grant replication client,replication slave on *.* to 'repl'@'%' identified by 'repl'; 
此处不能使用'repl'@'192.168.%.%',否则从库同步,权限受制
show grants for "repl"@"%";

slave

vim /usr/local/mysql-5.7.23/data/3306/my.cnf
server-id   = 2
#log-bin= /usr/local/mysql-5.7.23/data/3306/mysql-bin
其他都和主数据库配置一样

连接数据库
/usr/local/mysql-5.7.23/bin/mysql -uroot -p -S /usr/local/mysql-5.7.23/data/3306/mysql.sock
change master to master_host='192.168.25.103',master_user='repl',master_password='repl',master_log_file='mysql-bin.000001',master_log_pos=550;
此处pos位置是主库show master status时的位置,主库还没有创建repl用户
start slave;
show slave status\G
  显示:
  Slave_IO_Running:Yes
  Slave_SQL_Running:Yes

测试主从同步数据

master
create database db1;
show databases;  创建成功

slave
show databases;  有db1,同步成功

参考文章:https://blog.csdn.net/zhoufoxcn/article/details/73065655?utm_source=tuicool&utm_medium=referral

相关文章

网友评论

    本文标题:编译安装MySQL主从(法1)

    本文链接:https://www.haomeiwen.com/subject/frwkiftx.html