CentOS7安装PHP开发环境4-源码安装MySQL5.7.22

解压安装包并编译安装,注意,解压后的文件,不可以放到windows共享目录里,要放到Linux自己的目录里。

软件版本
OS:CentOS 7
MySQL:5.7.22

安装

准备工具
系 统:CentOS 7
数据库:MySQL 5.7.22

下载mysql 5.7.22
下载页面:https://dev.mysql.com/downloads/mysql/5.7.html#downloads
下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.22.tar.gz
在这里插入图片描述
若已安装boost_1_59_0,则下载mysql-5.7.22.tar.gz。
若未安装boost_1_59_0,则下载mysql-boost-5.7.22.tar.gz。

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.22.tar.gz

可选安装boost_1_59_0

1.首先登陆boost官网(http://www.boost.org)
2.下载
3.解压下载文件
# tar -zxvf boost_1_59_0.tar.gz
4.进入加压后的文件,获得bjam
# cd boost_1_59_0
# ./bootstrap.sh
可以看到当前目录下生成了bjam文件
5.完整编译boost
# ./bjam
编译时间比较长
6.将生成的库默认安装到/usr/local/lib目录
# ./bjam install --prefix=/home/sy/local/boost1.59.0
此时可以看到/usr/local/lib目录下包含了很多Boost文件
7.简单测试一下Boost是否安装成功
# vim main.cpp

#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
        using boost::lexical_cast;
        int a = lexical_cast<int>("123");
        double b = lexical_cast<double>("123.12");
        std::cout<<a<<std::endl;
        std::cout<<b<<std::endl;
        return 0;
}

8.编译
# g++ -o main main.cpp
# ./main
编译成功,运行成功。
9.若第8步不成功,则执行# ./b2 --with-python install。然后执行第7、第8。

安装MySQL需要的依赖包和编译软件

# yum install ncurses-devel libaio-devel cmake -y

检测是否已安装MySQL

首先检查是否已经安装过MySQL:

# rpm -qa | grep mysql

有的话就卸载掉以前安装的MySQL:

# rpm -e --nodeps xxx(xxx是搜索结果)

并删除所有的相关文件:/etc/my.cnf(可用有 mv /etc/my.cnf /etc/my.cnf.back)

建立MySQL用户账户

创建mysql用户(但是不能使用mysql账号登陆系统)(要修改成如下方式)
检查系统是否已经有mysql用户,

# cat /etc/passwd | grep mysql
# cat /etc/group | grep mysql

如果没有则创建

# groupadd mysql
# useradd -s /sbin/nologin -g mysql mysql

或者使用如下命令创建

# useradd -s /sbin/nologin -M mysql  #<==默认会创建和mysql用户同名的组。

创建目录

# mkdir -p /var/lib/mysql
# chown mysql:mysql -R /var/lib/mysql
# mkdir -p /usr/local/mysql
# chown mysql:mysql -R /usr/local/mysql

解压并配置MySQL,命令及操作

# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BOOST=boost/boost_1_59_0 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci

注意-DWITH_BOOST选项,
若下载mysql-5.7.22.tar.gz,则-DWITH_BOOST=/home/sy/local/boost1.59.0/include \
若下载mysql-boost-5.7.22.tar.gz,则-DWITH_BOOST=boost/boost_1_59_0 \

参数官网文档

编译并安装MySQL

如果是多核CPU,则可指定make -j CPU核数,加快编译速度。

# make
# make install

为MySQL安装路径设置不带版本号的软连接

为MySQL安装路径设置不带版本号的软连接/application/mysql,操作命令如下

# ln -s /usr/local/mysql /application/mysql

单实例配置

初始化MySQL 5.7单实例数据库

进入安装目录

# cd /usr/local/mysql/

初始化数据库命令 MySQL安装目录/bin/mysqld --initialize --user=mysql,看最后一行会生成root用户在本地登录的初始密码

[root@sy-pc mysql]# /application/mysql/bin/mysqld --initialize --user=mysql
2019-07-06T16:13:17.526561Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-07-06T16:13:18.523248Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-07-06T16:13:18.668015Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-07-06T16:13:18.746466Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: f7b408cd-a008-11e9-a35a-0800273e5634.
2019-07-06T16:13:18.749170Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-07-06T16:13:18.751387Z 1 [Note] A temporary password is generated for root@localhost: Cj!l#-jkw0AQ

注意最后一行的末尾root@localhost: Cj!l#-jkw0AQ。其中Cj!l#-jkw0AQ是root用户在IP地址为localhost机器的登录密码。如果错过了,可以通过查看/root/.mysql_secret即可查看到默认密码。

启动数据库

/application/mysql/support-files/mysql.server start

[root@sy-pc mysql]# ./support-files/mysql.server start
Starting MySQL. SUCCESS! 

同理,关闭数据库

[root@sy-pc mysql]# ./support-files/mysql.server stop
Shutting down MySQL.. SUCCESS!

查看是否启动

# netstat -lntp|grep mysql
tcp6    0    0 :::3306    :::*    LISTEN    11515/mysqld

如上,有输出,则启动成功。

登录数据库并重置root用户密码

登录数据库
本地,或xshell

[root@sy-pc mysql]# ./bin/mysql -u root -p
Enter password: 

出入初始密码Cj!l#-jkw0AQ

进行其他SQL语句操作时,提示:

your password has expired. to log in you must change it using a client that supports expired passwords.

重置密码
把初始密码Cj!l#-jkw0AQ重置为root

mysql> set password=password('root');
Query OK, 0 rows affected, 1 warning (0.00 sec)

添加服务

拷贝服务脚本到init.d目录,并设置开机启动

# cp support-files/mysql.server /etc/init.d/mysqld

# service mysqld start --启动MySQL
# service mysqld stop --关闭MySQL
# service mysqld restart --重启MySQL
# service mysqld status --查看MySQL状态

设置开机启动

# chkconfig mysqld on

关闭开启启动

# chkconfig mysqld off
[root@sy-pc ~]# chkconfig --list mysqld

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

如果编辑了/usr/lib/systemd/system/mysqld.service文件,则可以使用以下命令。该文件的编辑,未完待续
# systemctl start mysqld --启动MySQL
# systemctl stop mysqld --关闭MySQL
# systemctl restart mysqld --重启MySQL
# systemctl status mysqld --查看MySQL状态
# systemctl enable mysqld --开机启动
# systemctl disable mysqld --禁止开机启动

绕过密码登陆

# vim /etc/my.cnf
[mysqld]
skip-grant-tables

经过以上步骤后,
错误日志 /usr/local/mysql/data/主机名.err
进程文件 /usr/local/mysql/data/主机名.pid
因为有主机名,这个过程不完美。

多实例配置

多实例配置完成后,MySQL双实例的目录信息及文件注释说明:

# tree /data
/data
|-- 3306
|   |-- data   #<==3306实例的数据文件。
|   |-- my.cnf #<==3306实例的配置文件。
|   `-- mysql  #<==3306实例的启动文件。
`-- 3307
    |-- data   #<==3307实例的数据文件。
    |-- my.cnf #<==3307实例的配置文件。
    `-- mysql  #<==3307实例的启动文件。
4 directories, 4 files

提示:这里的配置文件my.cnf、启动程序mysql都是独立的文件,数据文件data目录也是独立的。

创建MySQL多实例的数据文件目录

以"/data"目录作为MySQL多实例总的根目录,然后规划不同的数字(即MySQL实例端口号)作为“/data”下面的二级目录;不同的二级目录对应的数字就作为MySQL实例的端口号,以区别不同的实例;数字对应的二级目录下包含MySQL的数据文件、配置文件以及启动文件等。

下面以配置3306、3307两个实例为例进行讲解。创建MySQL多实例的目录如下:

# mkdir -p /data/{3306,3307}/data

创建MySQL多实例的配置文件

如果配置多实例,则其与单实例会有所不同。为了让MySQL多实例之间彼此独立,需要为每一个实例建立一个my.cnf配置文件和一个启动文件mysql,让它们分别对应自己的数据文件目录data。

# touch /data/{3306,3307}/my.cnf

不同的实例需要添加的my.cnf内容也会有区别。

MySQL 3306实例

# cat /data/3306/my.cnf 
[client]								#<==客户端模块
port		=3306						#<==客户端端口
socket		=/data/3306/mysql.sock

[mysqld]								#<==服务端模块
user		=mysql						#<==用户
port		=3306						#<==端口
socket		=/data/3306/mysql.sock		#<==socket路径
basedir		=/application/mysql			#<==安装路径
datadir		=/data/3306/data			#<==数据文件
log-bin		=/data/3306/mysql-bin		#<==二进制日志
server-id	=6

[mysqld_safe]							#<==启动服务模块
log-error	=/data/3306/www_3306.err	#<==错误日志
pid-file	=/data/3306/mysqld.pid		#<==进程号文件

MySQL 3307实例

# cat /data/3307/my.cnf 
[client]								#<==客户端模块
port		=3307						#<==客户端端口
socket		=/data/3307/mysql.sock

[mysqld]								#<==服务端模块
user		=mysql						#<==用户
port		=3307						#<==端口
socket		=/data/3307/mysql.sock		#<==socket路径
basedir		=/application/mysql			#<==安装路径
datadir		=/data/3307/data			#<==数据文件
log-bin		=/data/3307/mysql-bin		#<==二进制日志
server-id	=7

[mysqld_safe]							#<==启动服务模块
log-error	=/data/3307/www_3307.err	#<==错误日志
pid-file	=/data/3307/mysqld.pid		#<==进程号文件

创建MySQL多实例的启动文件

# touch /data/{3306,3307}/mysql
# chmod +x /data/{3306,3307}/mysql

MySQL 3306实例启动文件

# cat /data/3306/mysql
#! /bin/bash
port=3306
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_mycnf="/data/${port}/my.cnf"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path="/data/${port}/mysqld.pid"
start(){
	if [ ! -e "$mysql_sock" ];then
		printf "Starting MySQL...\n"
		/bin/sh ${CmdPath}/mysqld_safe --defaults-file=${mysql_mycnf} --pid-file=${mysqld_pid_file_path} 2>&1 > /dev/null &
		sleep 3
	else
		printf "MySQL is running...\n"
		exit 1
	fi
}
stop(){
	if [ ! -e "$mysql_sock" ];then
		printf "MySQL is stopped...\n"
		exit 1
	else
		printf "Stopping MySQL...\n"
		mysqld_pid=`cat ${mysqld_pid_file_path}` #mysqld_pid=`cat "$mysqld_pid_file_path"`
		if ( kill -0 $mysqld_pid 2> /dev/null )
			then
				kill ${mysqld_pid}
				sleep 2
		fi
	fi
}
restart(){
	printf "Restarting MySQL...\n"
	stop
	sleep 2
	start
}
case "$1" in
	start)
		start
	;;
	stop)
		stop
	;;
	restart)
		restart
	;;
	*)
		printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

MySQL 3307实例启动文件

# cat /data/3307/mysql
#! /bin/bash
port=3307
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_mycnf="/data/${port}/my.cnf"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path="/data/${port}/mysqld.pid"
start(){
	if [ ! -e "$mysql_sock" ];then
		printf "Starting MySQL...\n"
		/bin/sh ${CmdPath}/mysqld_safe --defaults-file=${mysql_mycnf} --pid-file=${mysqld_pid_file_path} 2>&1 > /dev/null &
		sleep 3
	else
		printf "MySQL is running...\n"
		exit 1
	fi
}
stop(){
	if [ ! -e "$mysql_sock" ];then
		printf "MySQL is stopped...\n"
		exit 1
	else
		printf "Stopping MySQL...\n"
		mysqld_pid=`cat ${mysqld_pid_file_path}`
		if ( kill -0 $mysqld_pid 2> /dev/null )
			then
				kill ${mysqld_pid}
				sleep 2
		fi
	fi
}
restart(){
	printf "Restarting MySQL...\n"
	stop
	sleep 2
	start
}
case "$1" in
	start)
		start
	;;
	stop)
		stop
	;;
	restart)
		restart
	;;
	*)
		printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

需要特别说明一下的是,在多实例启动文件中,启动MySQL不同实例服务所执行的命令实质上是有区别的,例如,
启动3306实例的命令如下:
mysqld_safe --defaults-file=/data/3306/my.cnf > /dev/null 2>&1 &
启动3307实例的命令如下:
mysqld_safe --defaults-file=/data/3307/my.cnf > /dev/null 2>&1 &

mysqladmin命令关闭方法,这个命令的缺点是必须要有数据库的root用户密码才能运行。
停止3306实例的命令如下:
mysqladmin -u root -p密码 -S /data/3306/mysql.sock shutdown
停止3307实例的命令如下:
mysqladmin -u root -p密码 -S /data/3307/mysql.sock shutdown

配置MySQL多实例的文件权限

# touch /data/3306/www_3306.err
# touch /data/3307/www_3307.err
# chown -R mysql:mysql /data

初始化MySQL多实例的数据库

初始化数据库的实质就是创建基础的数据库系统的库文件,例如,生成MySQL库表等。

初始化3306实例数据库

# /application/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf --initialize --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
2019-08-03T15:51:30.541158Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-08-03T15:51:33.281473Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-08-03T15:51:33.606688Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-08-03T15:51:33.693091Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 9165aecc-b606-11e9-9b6a-08002750ea64.
2019-08-03T15:51:33.695849Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-08-03T15:51:33.701733Z 1 [Note] A temporary password is generated for root@localhost: yLM38V6weT+y 

注意
  1.初始化时,第一个参数是–defaults-file,要放在–initialize前面。
  2.最后一行的末尾root@localhost: yLM38V6weT+y。其中yLM38V6weT+y是root用户在IP地址为localhost机器的登录密码。

初始化3307实例数据库
  略

启动MySQL多实例数据库

根据上文创建的MySQL多实例的启动文件,得 启动MySQL多实例数据库 的命令为:

# /data/3306/mysql start
# /data/3307/mysql start

同理,关闭MySQL多实例数据库命令为:

# /data/3306/mysql stop
# /data/3307/mysql stop

同理,重启MySQL多实例数据库命令为:

# /data/3306/mysql restart
# /data/3307/mysql restart

重置root用户密码

重置3306实例数据库root用户密码

启动3306实例数据库服务

[root@sy-pc ~]# /data/3306/mysql start
Starting MySQL...
[root@sy-pc ~]# netstat -lntup|grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      5831/mysqld

登录不同的实例需要指定不同实例的sock路径及mysql.sock文件,这个mysql.sock是在my.cnf配置文件里指定的。

登录3306实例,需要输入3306实例的初始密码yLM38V6weT+y

[root@sy-pc ~]# mysql -uroot -p -S /data/3306/mysql.sock
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22-log

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

未修改密码时,进行SQL语句操作,提示:

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

重置密码
把初始密码yLM38V6weT+y重置为root

mysql> set password=password('root');
Query OK, 0 rows affected, 1 warning (0.00 sec)

重置3307实例数据库root用户密码
  略

终端登录不同的实例

登录3306实例

# mysql -uroot -p -S /data/3306/mysql.sock 
Enter password:

登录3307实例

# mysql -uroot -p -S /data/3307/mysql.sock 
Enter password:

开机启动MySQL多实例数据库

  在 /etc/rc.loadl 文件中加入以下内容:

#mysql multi instances
/data/3306/mysql start
/data/3307/mysql start

远程登录

//查看配置

mysql> select host,user from user where user='root';
+-----------+------+
| host      | user |
+-----------+------+
| localhost | root |
+-----------+------+
1 row in set (0.00 sec)

//进行授权

mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)

grant all privileges on 数据库名.表名 to ‘用户名’@‘IP地址’ identified by ‘密码’ with grant option;
+++++++++++++++++++++++++++++
说明:
% 允许所有的IP地址访问
youpassword 新密码
flush privileges 刷新权限表,或者重启MySQL服务。
+++++++++++++++++++++++++++++

//刷新生效

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

客户端退出登录

mysql> exit;
Byb

关闭防火墙

查看防火墙状态
firewall-cmd --state
(关闭后显示not running,开启后显示running)

# firewall-cmd --state 

或者systemctl status firewalld.service
(关闭后显示Active: inactive (dead),开启后显示Active: active (running))

# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-07-22 16:38:26 CST; 17s ago
 Main PID: 9242 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─9242 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Jul 22 16:38:25 sy-pc systemd[1]: Starting firewalld - dynamic firewall daemon...
Jul 22 16:38:26 sy-pc systemd[1]: Started firewalld - dynamic firewall daemon.

添加防火墙

# firewall-cmd --zone=public --add-port=3306/tcp --permanent
# firewall-cmd --reload

关闭防火墙

临时关闭防火墙

# systemctl stop firewalld.service

禁止开启启动

# systemctl disable firewalld.service

开启防火墙

# systemctl start firewalld.service

关闭防火墙的步骤为:

# systemctl stop firewalld.service
# systemctl disable firewalld.service

Navicat错误提示

用Navicat执行SQL,有如下提示

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘his.a.AttachPathId’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

解决方法:MySQL实例的配置文件,如 vim /etc/my.cnf,添加如下内容:

[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

保存后重启MySQL

service mysql restart

参考文献

[1] Linux下安装Boost1.58[DB/OL]. https://blog.csdn.net/sinat_23857245/article/details/45225147
[2] 梁晶. 零基础轻松学MySQL 5.7[M]. 机械工业出版社,2018.10.01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值