解壓安裝包並編譯安裝,注意,解壓後的文件,不可以放到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