mysqllinux優化
Linux 進程通過 C 標准庫中的內存分配函數 malloc 向系統申請內存,但是到真正與內核交互之間,其實還隔了一層,即內存分配管理器(memory allocator)。常見的內存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。MySQL 默認使用的是 glibc 的 ptmalloc 作為內存分配器。
目前 jemalloc 應用於 Firefox、FaceBook 等,並且是 MariaDB、Redis、Tengine 默認推薦的內存分配器,而 tcmalloc 則應用於 WebKit、Chrome 等。
I 硬體配置優化
CPU選擇:多核的CPU,主頻高的CPU
內存:更大的內存
磁碟選擇:更快的轉速、RAID、陣列卡,
網路環境選擇:盡量部署在區域網、SCI、光纜、千兆網、雙網線提供冗餘、0.0.0.0多埠綁定監聽
II 操作系統級優化
使用64位的操作系統,更好的使用大內存。
設置noatime,nodiratime
[zhangxy@dowload_server1 ~]$ cat /etc/fstab
LABEL=/ / ext3 defaults,noatime,nodiratime 1 1
/dev/sda5 /data xfs defaults,noatime,nodiratime 1 2
優化內核參數
net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.neigh.default.gc_thresh3 = 2048
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh1 = 256
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 2048
net.core.dev_weight = 64
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_sack = 0
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_orphans = 32768
net.core.optmem_max = 20480
net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 500
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_max_tw_buckets = 18000
net.ipv4.ip_forward = 0
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_local_port_range = 5000 65000
kernel.shmmax = 167108864
vm.swappiness=0
加大文件描述符限制
Vim /etc/security/limits.conf
加上
* soft nofile 65535
* hard nofile 65535
文件系統選擇 xfs
/dev/sda5 /data xfs defaults,noatime,nodiratime 1 2
III Mysql設計優化
III.1存儲引擎的選擇
Myisam:資料庫並發不大,讀多寫少,而且都能很好的用到索引,sql語句比較簡單的應用,TB數據倉庫
Innodb:並發訪問大,寫操作比較多,有外鍵、事務等需求的應用,系統內存較大。
III.2命名規則
多數開發語言命名規則:比如MyAdress
多數開源思想命名規則:my_address
避免隨便命名
III.3欄位類型選擇
欄位類型的選擇的一般原則:
根據需求選擇合適的欄位類型,在滿足需求的情況下欄位類型盡可能小。
只分配滿足需求的最小字元數,不要太慷慨。
原因:更小的欄位類型更小的字元數佔用更少的內存,佔用更少的磁碟空間,佔用更少的磁碟IO,以及佔用更少的帶寬。
III.3.1 整型:
見如下圖:
類型
位元組
最小值
最大值
(帶符號的/無符號的)
(帶符號的/無符號的)
TINYINT
1
-128
127
0
255
SMALLINT
2
-32768
32767
0
65535
MEDIUMINT
3
-8388608
8388607
0
16777215
INT
4
-2147483648
2147483647
0
4294967295
BIGINT
8
-9223372036854775808
9223372036854775807
0
18446744073709551615
根據滿足需求的最小整數為選擇原則,能用INT的就不要用BIGINT。
用無符號INT存儲IP,而非CHAR(15)。
III.3.2 浮點型:
類型
位元組
精度類型
使用場景
FLOAT(M,D)
4
單精度
精度要求不高,數值比較小
DOUBLE(M,D)(REAL)
8
雙精度
精度要求不高,數值比較大
DECIMAL(M,D)(NUMERIC)
M+2
自定義精度
精度要求很高的場景
III.3.3 時間類型
類型
取值范圍
存儲空間
零值表示法
DATE
1000-01-01~9999-12-31
3位元組
0000-00-00
TIME
-838:59:59~838:59:59
3位元組
00:00:00
DATETIME
1000-01-01 00:00:00~9999-12-31 23:59:59
8位元組
0000-00-00 00:00:00
TIMESTAMP
19700101000000~2037年的某個時刻
4位元組
00000000000000
YEAR
YEAR(4):1901~2155 YEAR(2):1970~2069
1位元組
0000
III.3.4 字元類型
類型
最大長度
佔用存儲空間
CHAR[(M)]
M位元組
M位元組
VARCHAR[(M)]
M位元組
M+1位元組
TINYBLOD,TINYTEXT
2^8-1位元組
L+1位元組
BLOB,TEXT
2^16-1位元組
L+2
MEDIUMBLOB,MEDIUMTEXT
2^24-1位元組
L+3
LONGBLOB,LONGTEXT
2^32-1位元組
L+4
ENUM('value1','value2',...)
65535個成員
1或2位元組
SET('value1','value2',...)
64個成員
1,2,3,4或8位元組
註:L表示可變長度的意思
對於varchar和char的選擇要根據引擎和具體情況的不同來選擇,主要依據如下原則:
1. 如果列數據項的大小一致或者相差不大,則使用char。
2. 如果列數據項的大小差異相當大,則使用varchar。
3. 對於MyISAM表,盡量使用Char,對於那些經常需要修改而容易形成碎片的myisam和isam數據表就更是如此,它的缺點就是佔用磁碟空間。
4. 對於InnoDB表,因為它的數據行內部存儲格式對固定長度的數據行和可變長度的數據行不加區分(所有數據行共用一個表頭部分,這個標頭部分存放著指向各有關數據列的指針),所以使用char類型不見得會比使用varchar類型好。事實上,因為char類型通常要比varchar類型佔用更多的空 間,所以從減少空間佔用量和減少磁碟i/o的角度,使用varchar類型反而更有利。
5. 表中只要存在一個varchar類型的欄位,那麼所有的char欄位都會自動變成varchar類型,因此建議定長和變長的數據分開。
III.4編碼選擇
單位元組 latin1
多位元組 utf8(漢字佔3個位元組,英文字母佔用一個位元組)
如果含有中文字元的話最好都統一採用utf8類型,避免亂碼的情況發生。
III.5主鍵選擇原則
註:這里說的主鍵設計主要是針對INNODB引擎
1. 能唯一的表示行。
2. 顯式的定義一個數值類型自增欄位的主鍵,這個欄位可以僅用於做主鍵,不做其他用途。
3. MySQL主鍵應該是單列的,以便提高連接和篩選操作的效率。
4. 主鍵欄位類型盡可能小,能用SMALLINT就不用INT,能用INT就不用BIGINT。
5. 盡量保證不對主鍵欄位進行更新修改,防止主鍵欄位發生變化,引發數據存儲碎片,降低IO性能。
6. MySQL主鍵不應包含動態變化的數據,如時間戳、創建時間列、修改時間列等。
7. MySQL主鍵應當有計算機自動生成。
8. 主鍵欄位放在數據表的第一順序。
推薦採用數值類型做主鍵並採用auto_increment屬性讓其自動增長。
III.6其他需要注意的地方
NULL OR NOT NULL
盡可能設置每個欄位為NOT NULL,除非有特殊的需求,原因如下:
1. 使用含有NULL列做索引的話會佔用更多的磁碟空間,因為索引NULL列需要而外的空間來保存。
2. 進行比較的時候,程序會更復雜。
3. 含有NULL的列比較特殊,SQL難優化,如果是一個組合索引,那麼這個NULL 類型的欄位會極大影響整個索引的效率。
索引
索引的缺點:極大地加速了查詢,減少掃描和鎖定的數據行數。
索引的缺點:佔用磁碟空間,減慢了數據更新速度,增加了磁碟IO。
添加索引有如下原則:
1. 選擇唯一性索引。
2. 為經常需要排序、分組和聯合操作的欄位建立索引。
3. 為常作為查詢條件的欄位建立索引。
4. 限制索引的數據,索引不是越多越好。
5. 盡量使用數據量少的索引,對於大欄位可以考慮前綴索引。
6. 刪除不再使用或者很少使用的索引。
7. 結合核心SQL優先考慮覆蓋索引。
8. 忌用字元串做主鍵。
反範式設計
適當的使用冗餘的反範式設計,以空間換時間有的時候會很高效。
IV Mysql軟體優化
開啟mysql復制,實現讀寫分離、負載均衡,將讀的負載分攤到多個從伺服器上,提高伺服器的處理能力。
使用推薦的GA版本,提升性能
利用分區新功能進行大數據的數據拆分
V Mysql配置優化
注意:全局參數一經設置,隨伺服器啟動預佔用資源。
key_buffer_size參數
mysql索引緩沖,如果是採用myisam的話要重點設置這個參數,根據(key_reads/key_read_requests)判斷
innodb_buffer_pool_size參數
INNODB 數據、索引、日誌緩沖最重要的引擎參數,根據(hit riatos和FILE I/O)判斷
wait_time_out參數
線程連接的超時時間,盡量不要設置很大,推薦10s
max_connections參數
伺服器允許的最大連接數,盡量不要設置太大,因為設置太大的話容易導致內存溢出,需要通過如下公式來確定:
SET @k_bytes = 1024;
SET @m_bytes = @k_bytes * 1024;
SET @g_bytes = @m_bytes * 1024;
SELECT
(
@@key_buffer_size + @@query_cache_size + @@tmp_table_size+
@@innodb_buffer_pool_size + @@innodb_additional_mem_pool_size+
@@innodb_log_buffer_size+
@@max_connections *
( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size+
@@join_buffer_size + @@binlog_cache_size + @@thread_stack
) )
/ @g_bytes AS MAX_MEMORY_USED_GB;
thread_concurrency參數
線程並發利用數量,(cpu+disk)*2,根據(os中顯示的請求隊列和tickets)判斷
sort_buffer_size參數
獲得更快的--ORDER BY,GROUP BY,SELECT DISTINCT,UNION DISTINCT
read_rnd_buffer_size參數
當根據鍵進行分類操作時獲得更快的--ORDER BY
join_buffer_size參數
join連接使用全表掃描連接的緩沖大小,根據select_full_join判斷
read_buffer_size參數
全表掃描時為查詢預留的緩沖大小,根據select_scan判斷
tmp_table_size參數
臨時內存表的設置,如果超過設置就會轉化成磁碟表,根據參數(created_tmp_disk_tables)判斷
innodb_log_file_size參數(默認5M)
記錄INNODB引擎的redo log文件,設置較大的值意味著較長的恢復時間。
Ø innodb_flush_method參數(默認fdatasync)
Linux系統可以使用O_DIRECT處理數據文件,避免OS級別的cache,O_DIRECT模式提高數據文件和日誌文件的IO提交性能
innodb_flush_log_at_trx_commit(默認1)
表示每秒進行一次log寫入cache,並flush log到磁碟。
表示在每次事務提交後執行log寫入cache,並flush log到磁碟。
表示在每次事務提交後,執行log數據寫入到cache,每秒執行一次flush log到磁碟。
VI Mysql語句級優化
1. 性能查的讀語句,在innodb中統計行數,建議另外弄一張統計表,採用myisam,定期做統計.一般的對統計的數據不會要求太精準的情況下適用。
2. 盡量不要在資料庫中做運算。
3. 避免負向查詢和%前綴模糊查詢。
4. 不在索引列做運算或者使用函數。
5. 不要在生產環境程序中使用select * from 的形式查詢數據。只查詢需要使用的列。
6. 查詢盡可能使用limit減少返回的行數,減少數據傳輸時間和帶寬浪費。
7. where子句盡可能對查詢列使用函數,因為對查詢列使用函數用不到索引。
8. 避免隱式類型轉換,例如字元型一定要用』』,數字型一定不要使用』』。
9. 所有的SQL關鍵詞用大寫,養成良好的習慣,避免SQL語句重復編譯造成系統資源的浪費。
10. 聯表查詢的時候,記得把小結果集放在前面,遵循小結果集驅動大結果集的原則。
11. 開啟慢查詢,定期用explain優化慢查詢中的SQL語句。
Ⅲ Linux下mysql讀寫速度為什麼很慢
怎麼可能,MySQL和Linux兼容性是最好的,可能是你的電腦配置太差,或者是你電腦上的Linux系統所佔的磁碟空間已滿,建議擴充一下磁碟空間
Ⅳ linux 下怎麼優化mysql佔用內存
Linux 進程通過 C 標准庫中的內存分配函數 malloc 向系統申請內存,但是到真正與內核交互之間,其實還隔了一層,即內存分配管理器(memory allocator)。常見的內存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。MySQL 默認使用的是 glibc 的 ptmalloc 作為內存分配器。
內存分配器採用的是內存池的管理方式,處在用戶程序層和內核層之間,它響應用戶的分配請求,向操作系統申請內存,然後將其返回給用戶程序。
為了保持高效的分配,分配器通常會預先向操作系統申請一塊內存,當用戶程序申請和釋放內存的時候,分配器會將這些內存管理起來,並通過一些演算法策略來判斷是否將其返回給操作系統。這樣做的最大好處就是可以避免用戶程序頻繁的調用系統來進行內存分配,使用戶程序在內存使用上更加高效快捷。
關於 ptmalloc 的內存分配原理,個人也不是非常了解,這里就不班門弄斧了,有興趣的同學可以去看下華庭的《glibc 內存管理 ptmalloc 源代碼分析》【文末鏈接】。
關於如何選擇這三種內存分配器,網上資料大多都是推薦摒棄 glibc 原生的 ptmalloc,而改用 jemalloc 或者 tcmalloc 作為默認分配器。因為 ptmalloc 的主要問題其實是內存浪費、內存碎片、以及加鎖導致的性能問題,而 jemalloc 與 tcmalloc 對於內存碎片、多線程處理優化的更好。
目前 jemalloc 應用於 Firefox、FaceBook 等,並且是 MariaDB、Redis、Tengine 默認推薦的內存分配器,而 tcmalloc 則應用於 WebKit、Chrome 等。
Ⅳ linux下安裝mysql,求助大俠們
MySQL有兩種安裝方式:源碼包安裝和二進制包安裝。這兩種方式各有特色:二位制包安裝不需編譯,針對不同的平台有經
過優化編譯的不同的二進制文件以及包格式,安裝簡單方便;源碼包則必須先配置編譯再安裝,可以根據你所用的主機環境進行優化,選擇最佳的配置值,安裝定製
更靈活。下面分別介紹這兩種安裝方式。
3.1 源碼包方式安裝
3.1.1 在linux系統中添加運行Mysql的用戶和組
/usr/sbin/groupadd mysql
/usr/sbin/useradd -d /var/lib/mysql -s /sbin/nologin -g mysql mysql
3.1.2 下載最新穩定發行版(GA)的MySQL軟體
訪問MySQL網站http://dev.mysql.com/downloads/下載最新穩定發行版的MySQL源碼包。本文使用的是5.0.51版本,在linux系統下用下面的命令下載:
wget http://mysql.mirror.kangaroot.net/Downloads/MySQL-5.0/mysql-5.0.51.tar.gz
3.1.3 解壓縮下載的源碼包
首先建立一個工作目錄( 筆者建議的目錄為/usr/local/src/mysql ) :
mkdir -p /usr/local/src/mysql
將下載的源碼包移至工作目錄:
mv mysql-5.0.51.tar.gz /usr/local/src/mysql
進入工作目錄並用tar命令解壓源碼包:
cd /usr/local/src/mysql
tar zxvf mysql-5.0.51.tar.gz
命令執行結束後,當前工作目錄下將生成一個新的子目錄mysql-5.0.51,此目錄下即為mysql的源碼文件。
3.1.4 配置Makefile文件
進入MySQL源碼目錄:
cd mysql-5.0.51
執行下面的命令可查看可配置選項:
./configure --help
本文使用的配置命令格式如下:
CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors
-fno-exceptions -fno-rtti" ./configure
--prefix=/usr/local/mysql --enable-thread-safe-client --enable-assembler
--with-big-tables --with-client-ldflags=-all-static
--with-mysqld-ldflags=-all-static --with-charset=utf8
--with-collation=utf8_general_ci --with-extra-charsets=complex
配置選項說明:
CC:C編譯器的名稱(用於運行configure),本文示例為gcc
CFLAGS:C編譯器的標志(用於運行configure),本文示例為-O3,指定優化級別為3
CXX:C++編譯器的名稱(用於運行configure),本文示例為gcc
CXXFLAGS:C++編譯器的標志(用於運行configure)
--prefix:指定安裝目錄,本文示例為/usr/local/mysql
--localstatedir:指定默認資料庫文件保存目錄,默認為安裝目錄下的var目錄
--enable-thread-safe-client:編譯線程安全版的MySQL客戶端庫
--enable-assembler:使用一些字元函數的匯編版本
--with-client-ldflags:客戶端鏈接參數,本文示例為指定靜態編譯mysql客戶端
--with-mysqld-ldflags:伺服器端鏈接參數,本文示例為指定靜態編譯mysql伺服器
--with-big-tables:在32位平台上支持大於4G行的表
--with-charset:指定默認字元集。mysql默認使用latin1(cp1252)字元集,可以使用此選項更改。字元集可以是big5、
cp1251、cp1257、czech、danish、dec8、dos、euc_kr、gb2312、gbk、german1、hebrew、
hp8、hungarian、koi8_ru、koi8_ukr、latin1、latin2、sjis、swe7、tis620、ujis、usa7或
win1251ukr。
--with-collation:指定默認校對規則。mysql默認使用latin1_swedish_ci校對規則,可以使用此選項更改。
--with-extra-charsets:伺服器需要支持的字元集,有三種可能的值:空格間隔的一系列字元集名;complex ,包括不能動態裝載的所有字元集;all,將所有字元集包括進二進制。本文示例為complex。
注意:要想更改字元集和校對規則,要同時使用--with-charset和--with-collation選項。 校對規則必須是字元集的合法校對規則。(在mysql中使用SHOW COLLATION語句來確定每個字元集使用哪個校對規則)。
3.1.5 編譯源代碼
執行下面的命令編譯源代碼:
make
3.1.6 安裝
執行下面的命令安裝mysql到目標路徑:
make install
3.1.7 復制默認全局啟動參數配置文件到/etc目錄
源
碼方式安裝需要手動復制配置文件,配置模板位於源碼樹的support-files目錄,有my-small.cnf、my-medium.cnf、
my-large.cnf、my-huge.cnf四個,選擇跟你的環境相接近的一個復制到/etc目錄,並做適當修改。關於mysql配置文件的詳細信
息請參閱筆者的其它文章或是mysql官方文檔。
本文示例選擇my-medium.cnf,執行下面的命令將其復制到/etc目錄:
cp ./support-files/my-medium.cnf /etc/my.cnf
3.1.8 初始化授權表
執行下面的命令初始化授權表:
./scripts/mysql_install_db --user=mysql
3.1.9 更改mysql數據目錄屬主和許可權
默認資料庫文件保存目錄為安裝目錄下的var目錄,執行configure命令時可通過--localstatedir參數指定不同的目錄,本文示例為默認位置。
chown -R mysql.mysql /usr/local/mysql/var
chmod -R 700 /usr/local/mysql/var
3.1.10 設置開機自啟動服務控制腳本
執行下面的命令復制啟動腳本到資源目錄:
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
執行下面的命令增加mysqld服務控制腳本執行許可權:
chmod +x /etc/rc.d/init.d/mysqld
執行下面的命令將mysqld服務加入到系統服務:
chkconfig --add mysqld
執行下面的命令檢查mysqld服務是否已經生效:
chkconfig --list mysqld
命令輸出類似下面的結果:
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
表明mysqld服務已經生效,在2、3、4、5運行級別隨系統啟動而自動啟動,以後可以使用service命令控制mysql的啟動和停止。
啟動mysqld服務:
service mysqld start
停止mysqld服務:
service mysqld stop
執行下面的命令關閉開機自啟動:
chkconfig mysqld off
執行下面的命令可以改變開機自啟動的運行級別為3、5:
chkconfig --level 35 mysqld on
3.1.11 將mysql的bin目錄加入PATH環境變數
編輯/etc/profile文件:
vi /etc/profile
在文件最後添加如下兩行:
PATH=$PATH:/usr/local/mysql/bin
export PATH
執行下面的命令使所做的更改生效:
. /etc/profile
3.2 二進制包方式安裝
3.2.1 從安裝媒體安裝
Mysql二進制包已經包含在CentOS 5的安裝媒體中,可以直接從安裝媒體中安裝下面三個rpm包:
mysql-5.0.22-2.1.0.1.i386.rpm
mysql-devel-5.0.22-2.1.0.1.i386.rpm
mysql-server-5.0.22-2.1.0.1.i386.rpm
不同的版本文件名有所不同,請注意區分。
執行下面的命令安裝:
rpm -iUvh mysql-5.0.22-2.1.0.1.i386.rpm
rpm -iUvh mysql-devel-5.0.22-2.1.0.1.i386.rpm
rpm -iUvh mysql-server-5.0.22-2.1.0.1.i386.rpm
3.2.2 通過yum安裝
如果你安裝的機器此時可以連接到互聯網,筆者建議使用yum命令來簡化安裝過程:
yum install mysql-server mysql-devel mysql
yum將自動從centos的鏡像站點查找你指明的軟體的最新二進制包,並檢查軟體包依賴關系,安裝軟體的同時自動安裝其依賴的軟體包。
3.2.3 從mysql網站下載最新穩定版本的二進制包安裝
通過CentOS安裝媒體或yum安裝的二進制包版本會落後於mysql開發者網站發布的版本,可以從mysql網站下載安裝最新穩定版本的mysql。
訪問MySQL網站http://dev.mysql.com/downloads/下
載最新穩定發行版的相應硬體平台的MySQL。本文使用的是Red Hat Enterprise Linux 5 RPM (x86)
5.0.45版本。需要下載Server、Client、Headers and Libraries、Share Libraries/Shared
compatibility libraries幾個rpm包,其它為可選包,按需要選擇。
在linux系統下用下面的命令下載:
wget http://mysql.mirrors.pair.com/Downloads/MySQL-5.0/MySQL-server-community-5.0.45-0.rhel5.i386.rpm
wget http://mysql.mirrors.pair.com/Downloads/MySQL-5.0/MySQL-client-community-5.0.45-0.rhel5.i386.rpm
wget http://mysql.mirrors.pair.com/Downloads/MySQL-5.0/MySQL-devel-community-5.0.45-0.rhel5.i386.rpm
wget http://mysql.mirrors.pair.com/Downloads/MySQL-5.0/MySQL-shared-community-5.0.45-0.rhel5.i386.rpm
wget http://mysql.mirrors.pair.com/Downloads/MySQL-5.0/MySQL-shared-compat-5.0.45-0.rhel5.i386.rpm
執行下面的命令安裝:
rpm -iUvh MySQL-server-community-5.0.45-0.rhel5.i386.rpm
rpm -iUvh MySQL-client-community-5.0.45-0.rhel5.i386.rpm
rpm -iUvh MySQL-devel-community-5.0.45-0.rhel5.i386.rpm
rpm -iUvh MySQL-shared-community-5.0.45-0.rhel5.i386.rpm
rpm -iUvh MySQL-shared-compat-5.0.45-0.rhel5.i386.rpm
4. MySQL的配置
4.1 目錄結構
4.1.1 源碼包方式安裝目錄結構
源碼包方式安裝時通常是在3.1.4節中configure命令的--prefix選項指定的目錄中建立如下的目錄結構,特殊指定的目錄除外:
./bin #mysql用戶可執行文件目錄
./include/mysql #mysql C頭文件目錄
./info #mysql 信息文件目錄
./lib/mysql #mysql庫文件目錄
./libexec #mysql後台daemon程序目錄
./man #mysql聯機幫助文檔目錄
./mysql-test #mysql測試程序目錄
./share/mysql #mysql公用文件目錄,包括字元集、配置文件模板、啟動腳本、初始化SQL文件等
./sql-bench #mysql壓力測試程序目錄
/etc/my.cnf #mysql配置文件
/etc/rc.d/init.d/mysqld #mysqld服務啟動腳本
4.1.2 RPM二進制包方式安裝目錄結構
二進制包方式安裝時使用系統軟體默認目錄結構 :
/usr/bin #mysql用戶可執行文件目錄
/usr/libexec #mysql後台daemon程序目錄
/usr/lib/mysql #mysql庫文件目錄
/usr/lib64/mysql #如果為64系統,mysql 64位庫文件目錄
/usr/share/doc #mysql文檔目錄
/usr/share/info #mysql信息文件目錄
/usr/share/man #mysql聯機幫助文檔目錄
/usr/share/mysql #mysql字元集目錄
/usr/include/mysql #mysql C頭文件目錄
/var/log #mysqld服務日誌文件目錄
/var/run/mysqld #mysqld服務運行狀態目錄
/var/lib/mysql #mysql數據文件目錄
/etc/my.cnf #mysql配置文件
/etc/rc.d/init.d/mysqld #mysqld服務啟動腳本
4.2 配置文件
Linux
系統下,mysql的配置參數文件為my.cnf,一般按下面的順序查找此文件:/etc目錄、mysql安裝目錄、mysql數據目錄。配置模板位於源
碼樹的support-files目錄,有my-small.cnf、my-medium.cnf、my-large.cnf、my-huge.cnf四
個,關於mysql配置文件的詳細信息請參閱筆者的其它文章或是mysql官方文檔。
4.3 啟動mysqld服務
執行下面的命令啟動mysql:
service mysqld start
4.3 設置mysql帳號
mysql安裝後默認生成兩個帳號:一個是root,未設置密碼,可以從本機登錄到mysql;另一個是匿名帳號,無帳號名、無密碼,可以從本機登錄,未提供用戶名的連接都將假定為此帳號。這樣的設置存在著安全隱患,按下面的步驟進行更改。
以root帳號連接到mysql伺服器:
mysql -u root
如果提示找不到mysql文件,請嘗試使用絕對路徑,如本文示例為:
/usr/local/mysql/bin/mysql -u root
命令成功執行後將進入到mysql命令提示符下:
mysql>
(以下命令均在mysql命令提示符下執行)
改變當前資料庫為mysql:
use mysql
設置從本地主機登錄的root帳號密碼:
set password for root@localhost=password('your password');
或:
update user set password=password('your password') where user='root' and host='localhost';
刪除匿名帳號:
delete from user where user='' ;
刪除密碼為空的帳號:
delete from user where password='';
刪除允許非localhost主機登錄的帳號:
delete from user where host<>'localhost' ;
執行下面的命令使更改生效:
flush privileges ;
執行下面的命令退出mysql命令行:
quit
或:
/q
5. 結束語
至此,Mysql基本安裝完畢。希望本文能對初學者有所幫助。
Ⅵ 在linux安裝MySQL時採用源碼編譯安裝,但是如何讓MySQL的編譯時間縮短呢
可以試試在使用make && make install 時添加-j參數,不限制內核進行編譯安裝。或者-j 後加內核數 。例如 make -j 4 && make install -j 4
優點:速度快會相對提高很多
缺點:消耗大量CPU,內存資源。
我做過一個測試,如果不限定內核 (16核 80GB內存 )的伺服器編譯安裝mysql 5.0.7 安裝時長大致在10分鍾左右,但是測試時伺服器CPU跑滿100% ,內存消耗至少32GB。直接使用 make && make install 安裝耗時45分鍾,內存4GB ,CPU 10%左右。
Ⅶ linux怎麼修改mysql資料庫臨時表空間大小
先來說說臨時表的概念。 臨時表顧名思義,就是臨時的,用完銷毀掉的表。 數據既可以保存在臨時的文件系統上,也可以保存在固定的磁碟文件系統上。 臨時表有下面幾種:
1全局臨時表
這種臨時表從資料庫實例啟動後開始生效,在資料庫實例銷毀後失效。在MySQL裡面這種臨時表對應的是內存表,即memory引擎。
2會話級別臨時表
這種臨時表在用戶登錄系統成功後生效,在用戶退出時失效。在MySQL里的臨時表指的就是以 create temporary table 這樣的關鍵詞創建的表。
3事務級別臨時表
這種臨時表在事務開始時生效,事務提交或者回滾後失效。 在MySQL裡面沒有這種臨時表,必須利用會話級別的臨時表間接實現。
4檢索級別臨時表
這種臨時表在SQL語句執行之間產生,執行完畢後失效。 在MySQL裡面這種臨時表不是很固定,跟隨MySQL默認存儲引擎來變化。比如默認存儲引擎是MyISAM,臨時表的引擎就是MyISAM,並且文件生成形式以及數據運作形式和MyISAM一樣,只是數據保存在內存里;如果默認引擎是INNODB,那麼臨時表的引擎就是INNODB,此時它的所有信息都保存在共享表空間ibdata裡面。
MySQL 5.7對於InnoDB存儲引擎的臨時表空間做了優化。在MySQL 5.7之前,INNODB引擎的臨時表都保存在ibdata裡面,而ibdata的貪婪式磁碟佔用導致臨時表的創建與刪除對其他正常表產生非常大的性能影響。在MySQL5.7中,對於臨時表做了下面兩個重要方面的優化:
MySQL5.7 把臨時表的數據以及回滾信息(僅限於未壓縮表)從共享表空間裡面剝離出來,形成自己單獨的表空間,參數為innodb_temp_data_file_path。
在MySQL5.7 中把臨時表的相關檢索信息保存在系統信息表中:information_schema.innodb_temp_table_info.而MySQL 5.7之前的版本想要查看臨時表的系統信息是沒有太好的辦法。
需要注意的一點就是,雖然INNODB臨時表有自己的表空間,但是目前還不能自己定義臨時表空間文件的保存路徑,只能是繼承innodb_data_home_dir。此時如果想要拿其他的磁碟,比如內存檔來充當臨時表空間的保存地址,只能用老辦法,做軟鏈。舉個小例子:
我現在用的OS是 Ubuntu12.X,想用tmpfs文件系統充當臨時表空間,
root@ytt-master-VirtualBox:/usr/local/mysql/data#ln -s/run/shm/ /usr/local/mysql/data/tmp_space2
root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'
lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/
然後把
innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend
添加到my.cnf里的[mysqld]下面一行
重啟MySQL服務後,
mysql>select @@innodb_temp_data_file_pathG
***************************1. row ***************************
@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend
1 rowin set (0.00 sec)
先寫一個批量創建臨時表的存儲過程:
DELIMITER$$
USE`t_girl`$$
DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$
CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(
IN f_cnt INT UNSIGNED )
BEGIN
DECLARE i INT UNSIGNED DEFAULT 1;
WHILE i <= f_cnt
DO
SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');
PREPARE s1 FROM @stmt;
EXECUTE s1;
SET i = i + 1;
END WHILE;
DROP PREPARE s1;
END$$
DELIMITER;
現在來創建10張臨時表:
mysql>call sp_create_temporary_table(10);
QueryOK, 0 rows affected (0.07 sec)
如果在以前,我們只知道創建了10張臨時表,但是只能憑記憶或者手工記錄下來臨時表的名字等信息。
現在可以直接從數據字典裡面檢索相關數據。
mysql>select * frominformation_schema.innodb_temp_table_info;
+----------+--------------+--------+-------+----------------------+---------------+
|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |
+----------+--------------+--------+-------+----------------------+---------------+
| 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |
| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |
| 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |
| 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |
| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |
| 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |
| 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |
| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |
| 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |
| 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |
+----------+--------------+--------+-------+----------------------+---------------+
10rows in set (0.00 sec)
功能性我就寫到這里,大家性能方面如果有興趣可以找時間去測試。
Ⅷ Linux上MySQL優化提升性能 哪些可以優化的關閉NUMA特性
Linux上MySQL優化提升性能,可以優化關閉NUMA特性如下:
這些其實都源於CPU最新的技術:節能模式。操作系統和CPU硬體配合,系統不繁忙的時候,為了節約電能和降低溫度,它會將CPU降頻。
為了保證MySQL能夠充分利用CPU的資源,建議設置CPU為最大性能模式。這個設置可以在BIOS和操作系統中設置,當然,在BIOS中設置該選項更好,更徹底。
然後我們看看內存方面,我們有哪些可以優化的。
i)
我們先看看numa
非一致存儲訪問結構
(NUMA
:
Non-Uniform
Memory
Access)
也是最新的內存管理技術。它和對稱多處理器結構
(SMP
:
Symmetric
Multi-Processor)
是對應的。
我們可以直觀的看到:SMP訪問內存的都是代價都是一樣的;但是在NUMA架構下,本地內存的訪問和非
本地內存的訪問代價是不一樣的。對應的根據這個特性,操作系統上,我們可以設置進程的內存分配方式。目前支持的方式包括:
--interleave=nodes
--membind=nodes
--cpunodebind=nodes
--physcpubind=cpus
--localalloc
--preferred=node
簡而言之,就是說,你可以指定內存在本地分配,在某幾個CPU節點分配或者輪詢分配。除非
是設置為--interleave=nodes輪詢分配方式,即內存可以在任意NUMA節點上分配這種方式以外。其他的方式就算其他NUMA節點上還有內
存剩餘,Linux也不會把剩餘的內存分配給這個進程,而是採用SWAP的方式來獲得內存。
所以最簡單的方法,還是關閉掉這個特性。
關閉特性的方法,分別有:可以從BIOS,操作系統,啟動進程時臨時關閉這個特性。
a)
由於各種BIOS類型的區別,如何關閉NUMA千差萬別,我們這里就不具體展示怎麼設置了。
b)
在操作系統中關閉,可以直接在/etc/grub.conf的kernel行最後添加numa=off,如下所示:
kernel
/vmlinuz-2.6.32-220.el6.x86_64
ro
root=/dev/mapper/VolGroup-root
rd_NO_LUKS.UTF-8
rd_LVM_LV=VolGroup/root
rd_NO_MD
quiet
SYSFONT=latarcyrheb-sun16
rhgb
crashkernel=auto
rd_LVM_LV=VolGroup/swap
rhgb
crashkernel=auto
quiet
KEYBOARDTYPE=pc
KEYTABLE=us
rd_NO_DM
numa=off
另外可以設置
vm.zone_reclaim_mode=0盡量回收內存。
c)
啟動MySQL的時候,關閉NUMA特性:
numactl
--interleave=all
mysqld
當然,最好的方式是在BIOS中關閉。
ii)
我們再看看vm.swappiness。
vm.swappiness是操作系統控制物理內存交換出去的策略。它允許的值是一個百分比的值,最小為0,最大運行100,該值默認為60。vm.swappiness設置為0表示盡量少swap,100表示盡量將inactive的內存頁交換出去。
具體的說:當內存基本用滿的時候,系統會根據這個參數來判斷是把內存中很少用到的inactive
內存交換出去,還是釋放數據的cache。
Ⅸ linux mysql 5.6 能升級5.7 嗎
1. 下載 5.7.30 的 zip 包並解壓到新的目錄。
2. 安裝 Visual C++ 2012/2013(或更多版本)。
3. 停應用,停止 5.6 實例(可以通過停服務來操作,停止服務前建議記錄一下 GTID 或 binlog file 和 position 位置),刪除服務。
4. 備份一份 5.6 實例的 datadir,包括 binlog(整個目錄 到別的目錄存放)。
5. 拷貝 5.6 實例的 datadir 和 my.ini 到 5.7 實例 basedir 目錄,調整並優化參數值(注意要確保路徑一致,確認已開啟 5.7 新特性相關參數,如增強半同步、MTS 等)。
6. 修改系統環境變數,把可執行路徑指向 5.7 實例的 basedir/bin。
7. 啟動 5.7 實例,創建服務並啟動。
8. 驗證服務端、客戶端版本是否正確。
9. 確認無誤後,執行 mysql_upgrade 升級數據字典(會升級系統庫:mysql,ps,sys,沒有會重建)。
10. 重啟實例。
11. 再次校驗 5.7 的參數,盡量保持與 5.6 的兼容,尤其要注意 sql_mode 的默認值對業務的影響。
12. 清理 5.6 實例的 basedir 和 datadir 目錄(可選)。
13. 如果是主從環境,還要考慮 slave_net_timeout 參數默認值改變帶來的影響(主庫 error 日誌中出現 「ER_RPL_ZOMBIE_ENCOUNTERED」 的報錯)。
在 5.7.7 以前,該參數默認是 3600s,之後改為了 60s,需要重新執行 change master to 語句,並且顯式指定 master_heartbeat_period=xx,因為從 5.7.4 開始,只有執行 reset slave 才能將其重置為默認值(slave_net_timeout 值的一半)。另外提一句,也是從 5.7.4 開始,執行 change master to 語句時,可以不用先停止復制線程了。