Linux系統下自行編譯安裝MySQL及基礎配置全過程解析

来源:http://www.cnblogs.com/8hao/archive/2016/02/29/5226956.html
-Advertisement-
Play Games

安裝依賴: CentOS: # yum -y install wget gcc-c++ cmake make bison ncurses-devel perl unzip Ubuntu:(使用ubuntu下麵有不少需要root許可權,請註意) 複製代碼 代碼如下: # sudo apt-get ins


安裝依賴:

CentOS:

# yum -y install wget gcc-c++ cmake make bison ncurses-devel perl unzip

Ubuntu:(使用ubuntu下麵有不少需要root許可權,請註意)

 

複製代碼 代碼如下:
# sudo apt-get install -y g++ gcc make libpcre3 zlib1g libbz2-dev automake cmake perl libncurses5-dev bison

 

 

 

添加MySQL系統用戶

# groupadd mysql
# useradd -r -g mysql mysql

提前建立好相關目錄

# mkdir /data/logs/mysql
# mkdir /data/mysql

下載MySQL源代碼:

# wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.12.tar.gz

配置

# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 \
-DMYSQL_DATADIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_USER=mysql \
-DDEFAULT_CHARSET=utf8 \
-DEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DENABLE_DOWNLOADS=1

配置釋義:

-DCMAKE_INSTALL_PREFIX=/usr/local/server/mysql-5.6.12 設置安裝目錄
-DMYSQL_DATADIR=/data/mysql 設置資料庫存放目錄
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock 設置UNIX socket 目錄
-DMYSQL_USER=mysql 設置運行用戶
-DDEFAULT_CHARSET=utf8 設置預設字元集,預設latin1
-DEFAULT_COLLATION=utf8_general_ci 設置預設校對規則,預設latin1_general_ci
-DWITH_INNOBASE_STORAGE_ENGINE=1 添加InnoDB引擎支持
-DENABLE_DOWNLOADS=1 自動下載可選文件,比如自動下載谷歌的測試包
-DMYSQL_TCP_PORT=3306 設置伺服器監聽埠,預設3306
-DSYSCONFDIR=/data/etc 設置my.cnf所在目錄,預設為安裝目錄

更多參數執行 # cmake . -LH 或者查看官方說明

Note:

執行過程中會出現:

CMake Error: Problem with tar_extract_all(): Invalid argument
CMake Error: Problem extracting tar: /usr/local/src/mysql-5.6.12/source_downloads/gmock-1.6.0.zip

解決方法:
cd mysql目錄下麵會發現有一個source_downloads目錄,需要解壓unzip gmock-1.6.0.zip,然後再重新執行上述配置過程。當然你也可以去掉-DENABLE_DOWNLOADS=1這個選項,不編譯谷歌的測試包也沒有什麼問題,但是之前的某些版本會出現無法編譯的問題。

編譯安裝

# make && make install

建立鏈接文件,方便以後使用和升級:

# ln -s /usr/local/server/mysql-5.6.12 /usr/local/server/mysql

設置許可權:

# chown -R mysql:mysql /usr/local/server/mysql
# chown -R mysql:mysql /usr/local/server/mysql-5.6.12
# chown -R mysql:mysql /data/mysql
# chown -R mysql:mysql /data/logs/mysql

初始化資料庫

 

複製代碼 代碼如下:

 

# /usr/local/server/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/server/mysql --collation-server=utf8_general_ci

 


這時候會出現以下警告,下麵配置my.cnf會解決這個問題
詳情請查看 MySQL 5.6 中 TIMESTAMP 的變化

 

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
配置啟動項目:

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

修改安裝目錄下my.cnf,部分參數需要結合實際情況進行修改

[mysqld]
 
datadir = /data/mysql
socket = /tmp/mysql.sock
pid-file = /data/logs/mysql/mysql.pid
user = mysql
port = 3306
default_storage_engine = InnoDB
 
# InnoDB
#innodb_buffer_pool_size = 128M
#innodb_log_file_size = 48M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
 
# MyISAM
#key_buffer_size = 48M
 
# character-set
character-set-server=utf8
collation-server=utf8_general_ci
 
# name-resolve
skip-host-cache
skip-name-resolve
 
# LOG
log_error = /data/logs/mysql/mysql-error.log
long_query_time = 1
slow-query-log
slow_query_log_file = /data/logs/mysql/mysql-slow.log
 
# Others
explicit_defaults_for_timestamp=true
#max_connections = 500
open_files_limit = 65535
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
 
[client]
socket = /tmp/mysql.sock
port = 3306
Note:

被註釋掉的部分語句,需要結合業務和硬體資源進行修改,所以先占位,使用預設值即可。my.cnf文件中不能出現拼寫錯誤,否則,接下來啟動會出現很多意想不到的錯誤,如果出現無法啟動請參看:mysql-error.log文件。許可權設置不當也會導致啟動失敗。

啟動前,再次確認一遍許可權:

很有可能現在my.cnf的許可權不是mysql,同時檢查一下/etc/my.cnf是否存在,如果存在則刪除!!!

# chown -R mysql:mysql /usr/local/server/mysql-5.6.12

啟動mysql:

# service mysql start

添加環境變數

#echo 'export PATH=$PATH:/usr/local/server/mysql/bin'>> /etc/profile

安全設置(設定初始密碼,移除匿名用戶,移除測試資料庫):

# /usr/local/server/mysql/bin/mysql_secure_installation

添加開機啟動

CentOS:

# chkconfig mysql on

Ubuntu:

# sudo update-rc.d mysql defaults

配置須知:

MySQL有大量可以修改的配置選項,通常只需要把基本的項配置正確,應該將更多的時間花在schema的優化、索引上,以及查詢設計上。正確地配置MySQL的基本配置項後,再花力氣去修改其他配置選項的收益通常就比較小了。
過度優化的伺服器導致的潛在風險很大,容易頻繁崩潰、運行緩慢。
MySQL大多數預設配置選項已經是最佳配置了,所以最好不要做太多的改動,上文設置的參數對於大多數人已經夠多了。
沒有一勞永逸的配置,隨著資料庫內數據、用戶數量的變化,過一段時間後,可以有選擇地調整資料庫的配置。
基本配置選項詳解:

socket = /tmp/mysql.sock
pid_file = /data/logs/mysql/mysql.pid

socket和pid_file 文件如果不指定位置,放在預設編譯位置,在不同的MySQL版本里可能會導致一些錯誤

default_storage_engine = InnoDB

設定預設存儲引擎,創建表的時候最好顯式進行存儲引擎的配置

innodb_buffer_pool_size = 2G
innodb_log_file_size = 128M
innodb_file_per_table = 1
innodb_flush_method = 0_DIRECT

InnoDB最重要的兩個選項為緩衝池大小
innodb_buffer_pool_size和 日誌文件大小innodb_log_file_size,預設值一般都太小。

如果大部分表都是InnoDB表,InnoDB緩衝池的設置或許比其他任何東西都需要記憶體。InnoDB並不僅僅緩存索引:它還會緩存數據、自適應哈系索引、插入緩衝(Insert Buffer)、鎖,以及其他內部數據結構。InnoDB還使用緩衝池來幫助延遲寫入,合併多個寫入操作,一起順序寫回。總之,InnoDB嚴重依賴緩衝池,必須分配足夠記憶體。

Note:
緩衝池越大,預熱和關閉都需要很長時間。

InnoDB使用日誌來減少事務提交的開銷。因為日誌已經記錄了事務,就無須在每個事務提交時把緩衝池的脹快刷新到磁碟中。InnoDB用日誌把隨機I/O變成順序I/O。一旦日誌安全寫到磁碟,事務就持久化了。如果斷電,InnoDB可以重放日誌並且恢復已經提交的事務。
整體日誌大小受控於innodb_log_file_size和innodb_log_file_in_group兩個參數之乘積。一般需要設置幾百MB甚至上GB。作為經驗法則,一般日誌文件全部大小,應該足夠容納伺服器一小時的活動內容。

緩衝池大小設置方法:
從伺服器總記憶體開始
減去操作系統占用記憶體和其他服務占用記憶體(如果還有其他服務的話)
減去MySQL自身需要記憶體,例如為每個查詢操作分配一些緩衝。
減去足夠讓操作系統緩存InnoDB日誌文件的記憶體,至少是足夠緩存最近經常訪問的部分。再減去一些可以緩存二進位日誌的最後一部分,以防止複製產生了延遲,備庫可能讀取主庫上舊的二進位日誌文件,給主庫記憶體造成壓力。
減去其他MySQL緩衝和緩存需要的記憶體,如MyISAM鍵緩存(key_buffer_size),或者查詢緩存(query cache)
處以105%,向下取捨一個合理值。

Note:設置不需要很精確,而且寧可謹慎,而不要設置過大,如果設置少了20%可能只產生很小的影響,但是如果大了20%則可能造成很嚴重的問題:記憶體交換、磁碟抖動、記憶體耗盡和死機。

#MyISAM
key_buffer_size = 128M

MyISAM自身只緩存索引,不緩存數據(依賴操作系統緩存數據)。如果大部分為MyISAM表,就應該分配較大key_buffer_size。
再分配多大記憶體前,首先瞭解一下,MyISAM占用了多大的空間,肯定不需要分配比需要緩存的索引數據還大的記憶體(有時候為數據量擴增預留一些,會設置比較大)。
有兩個方法計算索引大小:
使用SQL語句,查詢INFORMATION——SCHEMA表的INDEX_LENGTH欄位,把他們相加即可。

SELECT SUM( INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MYISAM';

使用的UNIX系統,則使用以下命令

# du -sch `find /mysqldatadir -name “*.MYI”`

鍵緩存需要存儲多大的值?
不要超過索引總大小,也不要超過為操作系統緩存保留的總大小。取兩者較小值。

緩衝區使用率計算,通過SHOW STATUS和SHOW VARIABLES命令查看以下變數:

100 - ( ( Key_blocks_unused * key_cache_block_size) * 100 / key_buffer_size )

如果伺服器運行很長一段時間之後,還是沒有使用完所有緩衝鍵,就可以把緩衝鍵調小一點。

鍵緩衝命中率
從經驗上來講,每秒未命中次數更有用,假定一個磁碟每秒可以產生100個隨機讀,每秒5次緩存未命中則不會導致I/O繁忙,每秒80次則可能導致I/O繁忙。計算公式:

Key_reads / Uptime

設定預設字元集和編碼

# character-set-server
character-set-server=utf8
collation-server=utf8_general_ci

以下選項設定僅使用IP來鏈接MySQL伺服器,省略了DNS查詢時間
閱讀材料:http://dev.mysql.com/doc/refman/5.6/en/host-cache.html

# name-resolve
skip-name-resolve
skip-host-cache

設定錯誤日誌和慢查詢日誌。大於1s的為慢查詢

# LOG
log_error = /data/logs/mysql/mysql-error.log
long_query_time = 1
slow_query_log
slow_query_log_file = /data/logs/mysql/mysql-slow.log

# Others
#timestamp預設設置,5.6.6後不設置會報錯
explicit_defaults_for_timestamp=true

設定同時處理的最大鏈接,保證應用激增產生而不堪重負,當查詢不能執行,那打開一個鏈接沒有任何好處,所以被“太多鏈接”的錯誤拒絕是一個快速而代價下的失敗方式。具體設定需要參考預想的最大併發數和本機配置。

max_connections = 500

table_open_cache was known as table_cache in MySQL 5.1.2 and earlier.
table_open_cache應該設置足夠大,避免總是重新打開和解析表定義。如果Open_tables的值每秒變化很大,那麼table_open_cache可能設置偏小。這個值從max_connections的10倍開始設置比較好,但是,大部分情況下不要超過10000.

table_open_cache = 5000

如果在段時間內不斷有錯誤鏈接,比如:許可權錯誤,應用配置出錯等。客戶端達到max_connect_errors設定次數,就會被加入黑名單,無法連接,直到再次刷新主機緩存。(如何操作?)可以有效防止暴力破解密碼。

max_connect_errors = 2000

在典型的Linux系統上我們把open_files_limit設置的儘可能大。現代操作系統中打開文件句柄開銷都較小。如果這個參數設置不夠大,會出現經典的24號錯誤:”too many open files”。

open_files_limit = 65535

 

問啊-一鍵呼叫程式員答題神器,牛人一對一服務,開發者編程必備官方網站:www.wenaaa.com

QQ群290551701 聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ubuntu上mysql預設安裝使用的字元集是latin1。 1 查看字元集支持 show character set; 2 查看字元集相關變數 show variables like "character_set%"; 3 設置預設字元集 為解決亂碼問題,最簡單的辦法就是修改預設字元集。修改預設字
  • (一)是否存在一個伺服器性能基線? (1)、有了基線才有一個衡量的指標,否則一切計數器都是沒有意思。否則可能我的系統本來就很慢,例如現在公司就有一個OLAP系統,每天就花了三個小時產生一個報表。也不是問題。 (2)、有了基線才能確認我的伺服器確實存在調整的必要了,例如今天發佈新的代碼後,性能明顯偏離
  • 本文目錄列表: 1、SQL Server中的基準日期 2、smalldatetime的日期範圍 3、smalldatetime的日期範圍和無符號2位元組整數的關係 4、總結語 5、參考清單列表 SQL Server中的基準日期 SQL Server 中針對datetime和smalldatetime這
  • 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7
  • hiredis 是 redis 的client端C語言 lib, hiredis擁有同步和非同步的API, 非同步API的實現有多種方法,分別依賴libev, libevent, libuv, ae等等,其中ae是redis內部實現的一個非同步事件處理模塊。 稍微修改了hiredis的example-ae
  • 寫完DML語句(update, insert, delete)後,需要手動COMMIT,如果沒有COMMIT,更新的內容會被保存到記憶體中,而不是提交到資料庫中,將不會被其他Session(對話)看見。其他對話看到的是更新前的數據。當用戶退出對話時,Oracle才會自動Commit。 而DDL語句(c
  • 一、 Redis常用數據類型 Redis最為常用的數據類型主要有以下: String Hash List Set Sorted set 一張圖說明問題的本質 圖一: 圖二: 代碼: /* Object types */ #define REDIS_STRING 0 #define REDIS_LIS
  • MySQL中的註釋 MySQL中的註釋有三種: # 註釋內容 -- 註釋內容 /* 註釋內容*/ 但是,在導出的SQL文件中,也會看到類似如下內容的註釋: 1 CREATE DATABASE `blog` /*!40100 DEFAULT CHARACTER SET latin1 */; 其中的 /
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...