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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章