安装所需包
耗时长,所需空间也大
/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
网友评论