前言
一般我們要去熟悉源碼,就先要看看怎么讓源碼運(yùn)行起來(lái),mysql的源碼如果需要運(yùn)行起來(lái)存在一些難度,因此我們來(lái)嘗試下如何將我們之前下載到的源碼運(yùn)行起來(lái)。
下載源碼
git clone https://github.com/mysql/mysql-server.git
運(yùn)行環(huán)境
我使用的是macOS 10.15,需要按照cmake編譯器。利用homebrew進(jìn)行資源安裝。
brew install cmake
依賴庫(kù)
編譯源碼
##mysql目錄
cd mysql-server-8.0
mkdir build && cd build
執(zhí)行cmake
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/XXXXXXXXX/mysql/mysql-server-8.0/boost/boost_1_72_0
執(zhí)行make
make -j 12
將/usr/local/mysql/bin增加到PATH
vim ~/.bash_profile
###增加
export PATH=$PATH:/usr/local/mysql/bin
source ~/.bash_profile
增加my.cnf配置
cd /usr/local/mysql
mkdir etc
cd /usr/local/mysql/etc
touch my.cnf
文件內(nèi)容
[client]
port = 3306
socket = /Users/[自己目錄](méi)/mysql/mysql.sock
[mysqld]
#Mysql服務(wù)的唯一編號(hào) 每個(gè)mysql服務(wù)Id需唯一
server-id = 1
#服務(wù)端口號(hào) 默認(rèn)3306
port = 3306
#mysql安裝根目錄
basedir = /usr/local/mysql
#mysql數(shù)據(jù)文件所在位置
datadir = /Users/[自己目錄](méi)/mysql/data
#pid
pid-file = /Users/[自己目錄](méi)/mysql/mysql.pid
#設(shè)置socke文件所在目錄
socket = /Users/[自己目錄](méi)/mysql/mysql.sock
#設(shè)置臨時(shí)目錄
tmpdir = /Users/[自己目錄](méi)/mysql/tmp
# 用戶
#user = mysql
# 允許訪問(wèn)的IP網(wǎng)段
bind-address = 0.0.0.0
# 跳過(guò)密碼登錄
#skip-grant-tables
#主要用于MyISAM存儲(chǔ)引擎,如果多臺(tái)服務(wù)器連接一個(gè)數(shù)據(jù)庫(kù)則建議注釋下面內(nèi)容
skip-external-locking
#只能用IP地址檢查客戶端的登錄,不用主機(jī)名
skip_name_resolve = 1
#事務(wù)隔離級(jí)別,默認(rèn)為可重復(fù)讀,mysql默認(rèn)可重復(fù)讀級(jí)別(此級(jí)別下可能參數(shù)很多間隙鎖,影響性能)
transaction_isolation = READ-COMMITTED
#數(shù)據(jù)庫(kù)默認(rèn)字符集,主流字符集支持一些特殊表情符號(hào)(特殊表情符占用4個(gè)字節(jié))
character-set-server = utf8mb4
#數(shù)據(jù)庫(kù)字符集對(duì)應(yīng)一些排序等規(guī)則,注意要和character-set-server對(duì)應(yīng)
collation-server = utf8mb4_general_ci
#設(shè)置client連接mysql時(shí)的字符集,防止亂碼
init_connect='SET NAMES utf8mb4'
#是否對(duì)sql語(yǔ)句大小寫(xiě)敏感,1表示不敏感
lower_case_table_names = 1
#最大連接數(shù)
max_connections = 400
#最大錯(cuò)誤連接數(shù)
max_connect_errors = 1000
#TIMESTAMP如果沒(méi)有顯示聲明NOT NULL,允許NULL值
explicit_defaults_for_timestamp = true
#SQL數(shù)據(jù)包發(fā)送的大小,如果有BLOB對(duì)象建議修改成1G
max_allowed_packet = 128M
#MySQL連接閑置超過(guò)一定時(shí)間后(單位:秒)將會(huì)被強(qiáng)行關(guān)閉
#MySQL默認(rèn)的wait_timeout 值為8個(gè)小時(shí), interactive_timeout參數(shù)需要同時(shí)配置才能生效
interactive_timeout = 1800
wait_timeout = 1800
#內(nèi)部?jī)?nèi)存臨時(shí)表的最大值 ,設(shè)置成128M。
#比如大數(shù)據(jù)量的group by ,order by時(shí)可能用到臨時(shí)表,
#超過(guò)了這個(gè)值將寫(xiě)入磁盤(pán),系統(tǒng)IO壓力增大
tmp_table_size = 134217728
max_heap_table_size = 134217728
#禁用mysql的緩存查詢結(jié)果集功能
#后期根據(jù)業(yè)務(wù)情況測(cè)試決定是否開(kāi)啟
#大部分情況下關(guān)閉下面兩項(xiàng)
#query_cache_size = 0
#query_cache_type = 0
#數(shù)據(jù)庫(kù)錯(cuò)誤日志文件
log_error = /Users/[自己目錄](méi)/mysql/logs/error.log
#慢查詢sql日志設(shè)置
slow_query_log = 1
slow_query_log_file = slow.log
#檢查未使用到索引的sql
log_queries_not_using_indexes = 1
#針對(duì)log_queries_not_using_indexes開(kāi)啟后,記錄慢sql的頻次、每分鐘記錄的條數(shù)
log_throttle_queries_not_using_indexes = 5
#作為從庫(kù)時(shí)生效,從庫(kù)復(fù)制中如何有慢sql也將被記錄
log_slow_slave_statements = 1
#慢查詢執(zhí)行的秒數(shù),必須達(dá)到此值可被記錄
long_query_time = 8
#檢索的行數(shù)必須達(dá)到此值才可被記為慢查詢
min_examined_row_limit = 100
#mysql binlog日志文件保存的過(guò)期時(shí)間,過(guò)期后自動(dòng)刪除
#expire_logs_days = 5
需要在制定的目錄創(chuàng)建對(duì)應(yīng)的文件,并且給予權(quán)限
chown -R mysql:mysql /Users/[自己目錄](méi)/mysql
cd /Users/[自己目錄](méi)/mysql
mkdir logs
chown -R mysql:mysql logs
mkdir tmp
chown -R mysql:mysql logs
執(zhí)行初始化數(shù)據(jù)庫(kù)
mysqld --initialize --console
2020-07-29T08:28:23.425549Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.21) initializing of server in progress as process 17211
2020-07-29T08:28:23.435503Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-07-29T08:28:23.871382Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-07-29T08:28:24.846075Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: o=Z#gkGpL0rh
2020-07-29T08:28:25.549759Z 0 [System] [MY-013172] [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.21).
啟動(dòng)mysql
cd /usr/local/mysql/support-files
./mysql.server start
########
#Starting MySQL
#.. SUCCESS!
#######
#看看mysql進(jìn)程
ps -ef|grep mysql
之前做了怎么多工作,重要可以看到我們熟悉的mysql了
mysql -u root -p
##密碼之前日志里面已經(jīng)生成了 就是 o=Z#gkGpL0rh
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.21
Copyright (c) 2000, 2020, 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.
注意點(diǎn)
1、macOS系統(tǒng)下面運(yùn)行的,最好使用8.0版本
2、過(guò)程中會(huì)遇到我這里可能沒(méi)有提到的一些問(wèn)題以及解決方案,需要耐心去解決
總結(jié)
mysql的源碼安裝,從官方的文檔上面看,是通過(guò)cmake進(jìn)行編譯,編譯完成之后就變成我們?nèi)粘?吹降目蓤?zhí)行文件。編譯最大的問(wèn)題點(diǎn)在于現(xiàn)在boost文件下載的時(shí)候,經(jīng)常會(huì)斷開(kāi),需要自己去下載,并且解壓到mysql源碼目錄下面。還有就是初始化環(huán)境,初始化環(huán)境的時(shí)候一些目錄權(quán)限的控制。
| 文件 | 內(nèi)容 |
|---|---|
| data | mysql數(shù)據(jù)存儲(chǔ)目錄 |
| logs | 日志輸出 |
| tmp | 臨時(shí)目錄 |