mysql基礎

mariadb編譯安裝

mysql編譯安裝
1、卸載mysql
    rpm -qa | grep mysql
    rpm -e --nodeps mysql-libs
    rpm -e --nodeps mysql
    rpm -e --nodeps mysql-server
    find / -name mysql #查找mysql開頭的庫或文件,依次刪除
    rm -fr /var/lib/mysql
    rm -fr /usr/lib/mysql
    rm -fr /usr/include/mysql
    rm -f /etc/my.cnf

二、準備工做

groupadd mysql
useradd -g mysql mysql -s /sbin/nologin -M
mkdir -p /usr/local/mysql
mkdir -p /usr/local/mysql/data
mkdir -p /usr/local/mysql/data/temp
mkdir -p /var/log/mysql
chown -R mysql:mysql /usr/local/mysql/
chown -R mysql:mysql /usr/local/mysql/data/
chown -R mysql:mysql /var/log/mysql
chown -R mysql:mysql /usr/local/mysql/data/tempphp

    
    yum -y install make gcc-c++ cmake bison-devel ncurses-devel readline-devel zlib-devel openssl-devel libaio-devel #MySQL5.5及以上版本都開始用cmake方式進行配置編譯,因此先安裝cmake及依賴庫,注意提早配置yum源爲aliyun,官方yum源中沒有cmake。
    
    cd /usr/local/src/
    wget https://downloads.mariadb.org/interstitial/mariadb-10.0.37/source/mariadb-10.0.37.tar.gz/from/http%3A//mirrors.tuna.tsinghua.edu.cn/mariadb/ #下載安裝包
3、配置編譯安裝
解壓後進入到解壓目錄
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITHOUT_TOKUDB=1 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_USER=mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
 
 
   #注意:-DCMAKE_INSTALL_PREFIX是指定安裝的位置,這裏是/usr/local/mysql,-DMYSQL_DATADIR是指定MySQL的數據目錄,這裏是/usr/local/mysql/data,安裝目錄和數據目錄均可以自定義設置,-DSYSCONFDIR是指定配置文件所在的目錄,通常都是/etc ,具體的配置文件是/etc/my.cnf,-DWITHOUT_TOKUDB=1這個參數通常都要設置上,表示不安裝tokudb引擎,tokudb是MySQL中一款開源的存儲引擎,能夠管理大量數據而且有一些新的特性,這些是Innodb所不具有的,這裏之因此不安裝,是由於通常計算機默認是沒有Percona Server的,而且加載tokudb還要依賴jemalloc內存優化,通常開發中也是不用tokudb的,因此暫時屏蔽掉,不然在系統中找不到依賴會出現:CMake Error at storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake:179 (message)這樣的錯誤。-DMYSQL_UNIX_ADDR參數指定了mysql的通信sock文件地址,此地址和php.ini中的mysqli.default_socket、mysql.default_socket、pdo_mysql.default_socket參數路徑保持一致,php.ini中的默認路徑爲/tmp/mysql.sock。若是萬一執行中有了錯誤,能夠執行: rm -f CMakeCache.txt 刪除編譯緩存,讓指令從新執行,不然每次讀取這個文件,命令修改正確也是報錯
    
    make && make install 
    chown -R mysql:mysql /usr/local/mysql/
chmod -R 1777 /tmp #調整tmp權限,不然初始化會報錯。
cd /usr/local/mysql ./scripts/mysql_install_db --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql --user=mysql #運行安裝腳本 cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf #實測不拷貝也可正常啓動,運行。一種解釋是mysql啓動時會自動去/etc/ 或安裝目錄下查找my.cnf文件,若是沒有,就是用系統內置參數(多是配置編譯時指定的)。 #/usr/local/mysql/bin/mysqld --verbose --help |grep -A 1 'Default options' 或者 mysql --help|grep 'my.cnf' #這兩條命令能夠查詢到mysql系統使用的的配置文件路徑,mysql啓動時按順序查找。 cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld #拷貝啓動文件到系統啓動目錄下 chkconfig --add mysqld # 添加至系統服務,可使用systemctl或service echo "export PATH=$PATH:/usr/local/mysql/bin/" >/etc/profile.d/mysql.sh #給mysql相關命令,配置環境變量配置文件,放到/etc/profile.d目錄下。 source /etc/profile

登錄故障node

[root@zqq-study ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)mysql

[root@zqq-study ~]# pkill mysqldlinux

rm -rf /usr/local/mysql/data/*    #刪除data文件夾下全部文件c++

而後從新初始化web

cd /usr/local/mysql
./scripts/mysql_install_db --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql --user=mysql #運行安裝腳本redis

優化:算法

#開啓慢查詢sql

slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1
drop database test; #刪除測試庫
delete from mysql.user where user=' ' #刪除系統默認空帳戶
delete from mysql.user where user='www' #刪除系統默認www帳號mongodb

重啓:
systemctl restart mariadb
mysql> show variables like "%character%";show variables like "%collation%"; //驗證字符集配置

 基本操做

1、登錄mariadb

一、鏈接到本機上的mariadb mysql -uroot -p \\安裝默認無密碼
二、鏈接到遠程主機上的mariadb
mysql -h10.195.236.135 -uroot -pabc12345
三、mysql遠程鏈接受權管理
mysql -uroot -p
use mysql; //切換到mysql數據庫中
select host,user,password from user; //查看當前系統user表中容許登錄用戶信息
update user set host = '10.195.249.225' where user= 'root'; //修改mysql庫的user表,將指定用戶的host項修改%或指定IP.此操做可能報錯可無論。
select host,user,password from user; //查看當前系統user表中容許登錄用戶信息
flush privileges;
四、exit //退出數據庫登錄

2、系統管理

mysqladmin -uroot password oldboy123 #給mysql管理員root配置密碼,安裝後密碼爲空
登錄mariadb
格式: mysql -h 主機地址 -u用戶名 -p用戶密碼
# mysql -uroot -pfhwfhw123!

# mysql -uroot -pfhwfhw123! -e "show variables like '%_log_%';" #直接使用linux命令行執行mysql命令,查詢log日誌開啓狀況及路徑。

修改密碼
格式: update mysql.user set password=password('新密碼') where user ='用戶名'
>use mysql;
>update user set password=password('fhwpbx') where user='dsh';
>flush privileges;

新增用戶(並受權登錄及查詢):
格式:grant select on 數據庫.* to 用戶名@登陸主機 identified by '密碼'
>grant select,insert on sbc.* to dsh@localhost identified by ‘dsh’;
>flush privileges;

查看用戶權限&回收用戶權限
>show grants for dsh@localhost;
>flush privileges;
>revoke select,insert on mysql.* from dsh@localhost;
>flush privileges;

配置mariadb用戶遠程登錄權限:
GRANT ALL PRIVILEGES ON *.* to 'root'@'10.199.49.60' identified by 'fhwfhw123!'; 

查看刪除用戶:
>use mysql;
>select host,user from user;
>delete from user where user='dsh' and host='localhost';
>flush privileges;

建立數據庫
>create database zzpbx charset utf8;

導入sql文件

mysql -uroot -poldboy123 </tmp/bak.sql #導入數據庫文件
mysql -uroot -poldboy123 -e "show databases like 'wordpress';" #在linux端使用mysql命令直接執行sql語句。

導入數據文件進mysql數據表中:
>load data infile "/home/sbc/log/2018041304.inv" into table invite fields terminated by ',' enclosed by '\'';

配置文件優化

vim /etc/my.cnf
[client]
#########################################################################
#                                                                       #
#                         MySQL客戶端配置                               #
#                                                                       #
#########################################################################
port = 3306 # MySQL客戶端默認端口號
socket = /tmp/mysql.sock# 用於本地鏈接的Unix套接字文件存放路徑
default-character-set = utf8mb4 # MySQL客戶端默認字符集
[mysql]
#########################################################################
#                                                                       #
#                         MySQL命令行配置                               #
#                                                                       #
#########################################################################
auto-rehash # 開啓tab補齊功能
socket = /tmp/mysql.sock # 用於本地鏈接的Unix套接字文件存放路徑
default-character-set = utf8mb4 # MySQL客戶端默認字符集
max_allowed_packet = 256M # 指定在網絡傳輸中一次消息傳輸量的最大值。系統默認值爲1MB,最大值是1GB,必須設置1024的倍數。

[mysqld]
#########################################################################
#                                                                       #
#                         MySQL服務端配置General                        #
#                                                                       #
#########################################################################
port = 3306 #指定了Mysql開放的端口;
basedir = /usr/local/mysql #指定Mysql安裝的絕對路徑;
datadir = /usr/local/mysql/data #指定Mysql數據存放的絕對路徑;
socket = /tmp/mysql.sock #若報錯提示此文件錯誤,首先find一下該文件的路徑,而後配置指向正確的路徑便可;其次誤刪除了,此時需重啓mysql服務,重啓完後會在datadir目錄下生成一個該文件,而後配置指向正確的路徑就能夠了;
plugin_dir = /usr/local/mysql/lib/plugin #mysql中plugin插件所在的路徑;    

pid_file = /usr/local/mysql/data/mysql.pid # 進程ID文件存放路徑
tmpdir = /usr/local/mysql/data/temp # MySQL臨時文件存放路徑
character_set_server = utf8mb4 # MySQL服務端字符集
collation_server = utf8mb4_general_ci # MySQL服務端校對規則
default-storage-engine = InnoDB # 設置默認存儲引擎爲InnoDB
autocommit = OFF # 默認爲ON,設置爲OFF,關閉事務自動提交

transaction_isolation = READ-COMMITTED
# MySQL支持4種事務隔離級別,他們分別是:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
# 如沒有指定,MySQL默認採用的是REPEATABLE-READ,ORACLE默認的是READ-COMMITTED

event_scheduler = ON # 開啓事件調度器event_scheduler
#explicit_defaults_for_timestamp = ON # 控制TIMESTAMP數據類型的特性,默認OFF,設置爲ON,update 時timestamp列關閉自動更新。(未來會被廢棄)
lower_case_table_names = 1 # 庫名、表名是否區分大小寫。默認爲0,設置1,不區分大小寫,建立的表、數據庫都以小寫形式存放磁盤。

########################################
#                                      #
#       Network & Connection           #
#                                      #
########################################
max_connections = 1000 # MySQL容許的最大併發鏈接數,默認值151,若是常常出現Too Many Connections的錯誤提示,則須要增大此值。
max_user_connections = 1000 # 每一個數據庫用戶的最大鏈接,(同一個帳號可以同時鏈接到mysql服務的最大鏈接數),默認爲0,表示不限制。
back_log = 500 # MySQL監聽TCP端口時設置的積壓請求棧大小,默認50+(max_connections/5),最大不超過900
max_connect_errors = 10000 # 每一個主機的鏈接請求異常中斷的最大次數。對於同一主機,若是有超出該參數值個數的中斷錯誤鏈接,則該主機將被禁止鏈接。如需對該主機進行解禁,執行:FLUSH HOST。
interactive_timeout = 28800 # 服務器關閉交互式鏈接前等待活動的秒數。交互式客戶端定義爲在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。默認值:28800秒(8小時)
wait_timeout = 28800
# 服務器關閉非交互鏈接以前等待活動的秒數。默認值:28800秒(8小時)
# 指定一個請求的最大鏈接時間,當MySQL鏈接閒置超過必定時間後將會被強行關閉。對於4GB左右內存的服務器來講,能夠將其設置爲5~10。
# 若是常常出現Too Many Connections的錯誤提示,或者show processlist命令發現有大量sleep進程,則須要同時減少interactive_timeout和wait_timeout值。
connect_timeout = 28800 # 在獲取鏈接時,等待握手的超時秒數,只在登陸時生效。主要是爲了防止網絡不佳時應用重連致使鏈接數漲太快,通常默認便可。
open_files_limit = 5000 # mysqld能打開文件的最大個數,默認最小1024,若是出現too mant open files之類的就須要增大該值。
max_allowed_packet = 256M # 指定在網絡傳輸中一次消息傳輸量的最大值。系統默認值 爲1MB,最大值是1GB,必須設置1024的倍數。

########################################
#                                      #
#          Thread & Buffer             #
#                                      #
########################################
sort_buffer_size = 2M # 排序緩衝區大小,connection級參數,默認大小爲2MB。若是想要增長ORDER BY的速度,首先看是否可讓MySQL使用索引,其次能夠嘗試增大該值。
read_buffer_size = 160M # 順序讀緩衝區大小,connection級參數,該參數對應的分配內存是每鏈接獨享。對錶進行順序掃描的請求將分配一個讀入緩衝區。
read_rnd_buffer_size = 160M # 隨機讀緩衝區大小,connection級參數,該參數對應的分配內存是每鏈接獨享。默認值256KB,最大值4GB。當按任意順序讀取行時,將分配一個隨機讀緩存區。
join_buffer_size = 320M # 聯合查詢緩衝區大小,connection級參數,該參數對應的分配內存是每鏈接獨享。
bulk_insert_buffer_size = 64M   # 批量插入數據緩存大小,能夠有效提升插入效率,默認爲8M
thread_cache_size = 8
# 服務器線程緩衝池中存放的最大鏈接線程數。默認值是8,斷開鏈接時若是緩存中還有空間,客戶端的線程將被放到緩存中,當線程從新被請求,將先從緩存中讀取。
# 根據物理內存設置規則以下:1G  —> 8,2G  —> 16,3G  —> 32,大於3G  —> 64

thread_stack = 256K # 每一個鏈接被建立時,mysql分配給它的內存。默認192KB,已知足大部分場景,除非必要不然不要動它,可設置範圍128KB~4GB。
query_cache_type = 0 # 關閉查詢緩存
query_cache_size = 0 # 查詢緩存大小,在高併發,寫入量大的系統,建議把該功能禁掉。
query_cache_limit = 4M    # 指定單個查詢可以使用的緩衝區大小,缺省爲1M
tmp_table_size = 1024M
# MySQL的heap(堆積)表緩衝大小,也即內存臨時表,默認大小是 32M。若是超過該值,則會將臨時表寫入磁盤。在頻繁作不少高級 GROUP BY 查詢的DW環境,增大該值。
# 實際起限制做用的是tmp_table_size和max_heap_table_size的最小值。

max_heap_table_size = 1024M # 用戶能夠建立的內存表(memory table)的大小,這個值用來計算內存表的最大行數值。
table_definition_cache = 400 # 表定義緩存區,緩存frm文件。表定義(global)是全局的,能夠被全部鏈接有效的共享。
table_open_cache = 1000 # 全部SQL線程能夠打開表緩存的數量,緩存ibd/MYI/MYD文件。 打開的表(session級別)是每一個線程,每一個表使用。
table_open_cache_instances = 4 # 對table cache 能拆成的分區數,用於減小鎖競爭,最大值64.

########################################
#                                      #
#               Safety                 #
#                                      #
########################################
#sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
# MySQL支持的SQL語法模式,與其餘異構數據庫之間進行數據遷移時,SQL Mode組合模式會有幫助。

local_infile = OFF # 禁用LOAD DATA LOCAL命令
plugin-load = validate_password.so # 加密認證插件,強制mysql設置複雜密碼
skip-name-resolve # 禁止MySQL對外部鏈接進行DNS解析,消除MySQL進行DNS解析。若是開啓該選項,全部遠程主機鏈接受權都要使用IP地址方式,不然MySQL將沒法正常處理鏈接請求!

skip-external-locking
#skip-locking 
# 避免MySQL的外部鎖定,減小出錯概率,加強穩定性。

#skip-networking 
# 不容許CP/IP鏈接,只能經過命名管道(Named Pipes)、共享內存(Shared Memory)或Unix套接字(Socket)文件鏈接。
# 若是Web服務器以遠程鏈接方式訪問MySQL數據庫服務器,則不要開啓該選項,不然沒法正常鏈接!
# 適合應用和數據庫共用一臺服務器的狀況,其餘客戶端沒法經過網絡遠程訪問數據庫

########################################
#                                      #
#                 Logs                 #
#                                      #
########################################
###################   General Log  ######################
general_log = OFF # 關閉通用查詢日誌
general_log_file = /var/log/mysql/general.log # 通用查詢日誌存放路徑

###################     Slow Log   ######################
slow_query_log = ON # 開啓慢查詢日誌
slow_query_log_file = /data/mysql/my3306/slow.log # 慢查詢日誌存放路徑
long_query_time = 10 # 超過10秒的查詢,記錄到慢查詢日誌,默認值10
log_queries_not_using_indexes = ON # 沒有使用索引的查詢,記錄到慢查詢日誌,打開可能引發慢查詢日誌快速增加
log_slow_admin_statements = ON
# 執行緩慢的管理語句,記錄到慢查詢日誌
# 例如 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.

###################     Error Log   ####################
log_error = /var/log/mysql/error.log # 錯誤日誌存放路徑
log_error_verbosity = 2
# 全局動態變量,默認3,範圍:13
# 表示錯誤日誌記錄的信息,1:只記錄error信息;2:記錄error和warnings信息;3:記錄error、warnings和普通的notes信息

########################################
#                                      #
#           Replication                #
#                                      #
########################################

###################     Bin Log    ######################
server_id = 1 # 數據庫服務器ID
log_bin = /var/log/mysql/binlog # 二進制日誌存放路徑
log_bin_index = /var/log/mysql/binlog.index # 同binlog,定義binlog的位置和名稱
binlog_format = row # binlog格式,複製有3種模式STATEMENT,ROW,MIXED
expire_logs_days = 10 # 只保留最近10天的binlog日誌
max_binlog_size = 50M # 每一個binlog日誌文件的最大容量
binlog_cache_size = 2M
# 每一個session分配的binlog緩存大小
# 事務提交前產生的日誌,記錄到Cache中;事務提交後,則把日誌持久化到磁盤

log_slave_updates = ON # 開啓log_slave_updates,從庫的更新操做記錄進binlog日誌

sync_binlog = 1
# sync_binlog=0(默認),事務提交後MySQL不刷新binlog_cache到磁盤,而讓Filesystem自行決定,或者cache滿了才同步。
# sync_binlog=n,每進行n次事務提交以後,MySQL將binlog_cache中的數據強制寫入磁盤。

binlog_rows_query_log_events = ON # 將row模式下的sql語句,記錄到binlog日誌,默認是0(off)

###################     Relay Log  ######################
relay_log = /var/log/mysql/relaylog # 中繼日誌存放路徑
relay_log_index = /data/mysql/my3306/relaylog.index # 同relay_log,定義relay_log的位置和名稱
#binlog_checksum = CRC32 # Session-Thread把Event寫到Binlog時,生成checksum。默認爲(NONE),兼容舊版本mysql。
master_verify_checksum = ON # Dump-Thread讀Binlog中的Event時,驗證checksum
slave_sql_verify_checksum = ON # 從庫的I/O-Thread把Event寫入Relaylog時,生成checksum;從庫的SQL-Thread從Relaylog讀Event時,驗證checksum
master_info_repository = TABLE
relay_log_info_repository = TABLE # 將master.info和relay.info保存在表中,默認是Myisam引擎,官方建議改成Innodb引擎,防止表損壞後自行修復。 

relay_log_purge = ON 
relay_log_recovery = ON
# 啓用relaylog的自動修復功能,避免因爲網絡之類的外因形成日誌損壞,主從中止。

skip_slave_start = OFF # 重啓數據庫,複製進程默認不啓動
slave_net_timeout = 5 # 當master和slave之間的網絡中斷,slave的I/O-Thread等待5秒,重連master
sync_master_info = 10000 # slave更新mysql.slave_master_info表的時間間隔

sync_relay_log = 10000
sync_relay_log_info = 10000
# slave更新mysql.slave_relay_log_info表的時間間隔

gtid_mode = ON
enforce_gtid_consistency = ON
# GTID即全局事務ID(global transaction identifier),GTID由UUID+TID組成的。
# UUID是一個MySQL實例的惟一標識,TID表明了該實例上已經提交的事務數量,而且隨着事務提交單調遞增。
# GTID可以保證每一個MySQL實例事務的執行(不會重複執行同一個事務,而且會補全沒有執行的事務)。下面是一個GTID的具體形式:
# 4e659069-3cd8-11e5-9a49-001c4270714e:1-77

auto_increment_offset  = 1 # 雙主複製中,2臺服務器的自增加字段初值分別配置爲1和2,取值範圍是1 .. 65535
auto_increment_increment = 2 # 雙主複製中,2臺服務器的自增加字段的每次遞增值都配置爲2,其默認值是1,取值範圍是1 .. 65535

########################################
#                                      #
#                InnoDB                #
#                                      #
########################################

innodb_data_home_dir = /usr/local/mysql/data # innodb表的數據文件目錄
innodb_file_per_table = ON # 使用獨立表空間管理
innodb_data_file_path = ibdata1:1G:autoextend # InnoDB共享表空間磁盤文件,存放數據字典、和在線重作日誌
innodb_log_group_home_dir = /usr/loaca/mysql/data # 在事務被提交併寫入到表空間磁盤文件上以前,事務數據存儲在InnoDB的redo日誌文件裏。這些日誌位於innodb_log_group_home_dir變量定義的目錄中
innodb_buffer_pool_size = 2G # InnoDB用於緩存數據、索引、鎖、插入緩衝、數據字典的緩衝池。該值越大,緩存命中率越高,可是過大會致使頁交換。

innodb_buffer_pool_instances = 8
# 開啓8個內存緩衝池,把須要緩衝的數據hash到不一樣的緩衝池中,這樣能夠並行的內存讀寫,下降併發致使的內部緩存訪問衝突。
# InnoDB緩存系統會把參數innodb_buffer_pool_size指定大小的緩存,平分爲innodb_buffer_pool_instances個buffer_pool

#innodb_additional_mem_pool_size = 16M
# InnoDB存儲數據字典、內部數據結構的緩衝池大小,相似於Oracle的library cache

innodb_log_file_size = 256M
# InnoDB redo log大小,對應於ib_logfile0文件。
# ib_logfile* 是Innodb多版本緩衝的一個保證,該日誌記錄redo、undo信息,即commit以前的數據,用於rollback操做。
# 官方文檔的建議設置是innodb_log_file_size = innodb_buffer_pool_size/innodb_log_files_in_group

innodb_log_buffer_size = 64M # redo日誌所用的內存緩衝區大小
innodb_log_files_in_group = 4 # redo日誌文件數,默認值爲2,日誌是以順序的方式寫入。

innodb_max_dirty_pages_pct = 90
# 緩存池中髒頁的最大比例,默認值是75%,若是髒頁的數量達到或超過該值,InnoDB的後臺線程將開始緩存刷新。
# 「緩存刷新」是指InnoDB在找不到乾淨的可用緩存頁或檢查點被觸發等狀況下,InnoDB的後臺線程就開始把「髒的緩存頁」回寫到磁盤文件中。

innodb_flush_log_at_trx_commit = 1
#設置爲0 ,每秒 write cache & flush disk
#設置爲1 ,每次commit都 write cache & flush disk
#設置爲2 ,每次commit都 write cache,而後根據innodb_flush_log_at_timeout(默認爲1s)時間 flush disk

innodb_lock_wait_timeout = 10
# InnoDB 有其內置的死鎖檢測機制,能致使未完成的事務回滾。可是,若是結合InnoDB使用MyISAM的lock tables語句或第三方事務引擎,則InnoDB沒法識別死鎖。
# 爲消除這種可能性,能夠將innodb_lock_wait_timeout設置爲一個整數值,指示MySQL在容許其餘事務修改那些最終受事務回滾的數據以前要等待多長時間(秒數)。

innodb_sync_spin_loops = 40
# 自旋鎖的輪轉數,能夠經過show engine innodb status來查看。
# 若是看到大量的自旋等待和自旋輪轉,則它浪費了不少cpu資源。浪費cpu時間和無謂的上下文切換之間能夠經過該值來平衡。

innodb_support_xa = ON
# 第一,支持多實例分佈式事務(外部xa事務),這個通常在分佈式數據庫環境中用得較多。
# 第二,支持內部xa事務,即支持binlog與innodb redo log之間數據一致性。

#innodb_file_format = barracuda
# InnoDB文件格式,Antelope是innodb-base的文件格式,Barracude是innodb-plugin後引入的文件格式,同時Barracude也支持Antelope文件格式。

innodb_flush_method = O_DIRECT
# 設置innodb數據文件及redo log的打開、刷寫模式,fdatasync(默認),O_DSYNC,O_DIRECT
# 默認是fdatasync,調用fsync()去刷數據文件與redo log的buffer
# 設置爲爲O_DSYNC時,innodb會使用O_SYNC方式打開和刷寫redo log,使用fsync()刷寫數據文件
# 設置爲O_DIRECT時,innodb使用O_DIRECT打開數據文件,使用fsync()刷寫數據文件跟redo log

innodb_strict_mode = OFF # 開啓InnoDB嚴格檢查模式,在某些狀況下返回errors而不是warnings,默認值是OFF
innodb_checksum_algorithm = strict_crc32 # checksum函數的算法,默認爲crc32。能夠設置的值有:innodb、crc3二、none、strict_innodb、strict_crc3二、strict_none
innodb_status_file = 1 # 啓用InnoDB的status file,便於管理員查看以及監控
innodb_open_files = 3000 # 限制Innodb能打開的表的數據,默認爲300,數據庫裏的表特別多的狀況,能夠適當增大爲1000。  
innodb_thread_concurrency = 4 # 同時在Innodb內核中處理的線程數量。服務器有幾個CPU就設置爲幾,建議默認值。
innodb_thread_sleep_delay = 500
#innodb_file_io_threads = 16 # 文件讀寫I/O數,這個參數只在Windows上起做用。在LINUX上只會等於4,默認便可。
innodb_read_io_threads = 16 # 設置read thread(讀線程個數,默認是4個)
innodb_write_io_threads = 16 # 設置write thread(寫線程個數,默認是4個)
innodb_io_capacity = 2000 # 磁盤io的吞吐量,默認值是200.對於刷新到磁盤頁的數量,會按照inodb_io_capacity的百分比來進行控制。
log_bin_trust_function_creators = 1 # 開啓log-bin後能夠隨意建立function,存在潛在的數據安全問題。
innodb_purge_threads = 1 # 使用獨立線程進行purge操做。每次DML操做都會生成Undo頁,系統須要按期對這些undo頁進行清理,這稱爲purge操做。
innodb_purge_batch_size = 32 # 在進行full purge時,回收Undo頁的個數,默認是20,能夠適當加大。

innodb_old_blocks_pct = 75
# LRU算法,默認值是37,插入到LRU列表端的37%,差很少3/8的位置。
# innodb把midpoint以後的列表稱爲old列表,以前的列表稱爲new列表,能夠理解爲new列表中的頁都是最爲活躍的熱點數據。

innodb_change_buffering = all
# 用來開啓各類Buffer的選項。該參數可選的值爲:inserts、deletes、purges、changes、all、none。
# changes表示啓用inserts和deletes,all表示啓用全部,none表示都不啓用。該參數默認值爲all。

[mysqldump]                        
max_allowed_packet = 256M
quick # mysqldump導出大表時頗有用,強制從服務器查詢取得記錄直接輸出,而不是取得全部記錄後將它們緩存到內存中。

[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
ledir = /usr/local/mysql/bin
# 包含mysqld程序的軟件安裝路徑,用該選項來顯式表示服務器位置。

mysql主從複製 

1、主從複製的相關概念

一、主從複製原理流程

  • 主節點必須啓用二進制日誌,記錄任何修改數據庫數據的事件。
  • 從節點開啓一個線程(I/O Thread)把本身扮演成mysql的客戶端,經過mysql協議,請求主節點的二進制日誌文件中的事件
  • 主節點啓動一個線程(dump Thread),檢查本身二進制日誌中的事件,跟對方請求的位置對比,若是不帶請求位置參數,則主節點就會從第一個日誌文件中的第一個事件一個一個發送給從節點。
  • 從節點接收到主節點發送過來的數據把它放置到中繼日誌(Relay log)文件中。並記錄該次請求到主節點的具哪一個二進制日誌文件的哪一個位置。
  • 從節點啓動另一個線程(sql Thread ),把replaylog中的事件讀取出來,並在本地再執行一次。

二、MySQL支持的複製類型

  • 基於語句的複製。 在主服務器上執行的 SQL語句,在從服務器上執行一樣的語句。配置:binlog_format = 'STATEMENT'
  • 基於行的複製。把改變的內容複製過去,而不是把命令在從服務器上執行一遍,從 MySQL 5.0開始支持,配置:binlog_format = 'ROW'
  • 混合類型的複製。默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製,配置:binlog_format = 'MIXED'

2、主從複製的經常使用架構設計

一、一主多從複製架構 場景:在主庫讀取請求壓力很是大的場景下,能夠經過配置一主多從複製架構實現讀寫分離,把大量對實時性要求不是特別高的讀請求經過負載均衡到多個從庫上,下降主庫的讀取壓力。在主庫出現異常宕機的狀況下,能夠把一個從庫切換爲主庫繼續提供服務;
建議:
     當 Slave 增長到必定數量時,Slave 對 Master 的負載以及網絡帶寬都會成爲一個嚴重的問題。
     不一樣的 Slave 扮演不一樣的做用(例如使用不一樣的索引,或者不一樣的存儲引擎)
     用一個 Slave 做爲備用 Master,只進行復制
    用一個遠程的 Slave,用於災難恢復。
二、多級複製架構 場景:一主多從的架構可以解決大部分讀請求壓力特別大的場景需求,但主庫的I/O壓力和網絡壓力會隨着從庫的增長而增加,而使用多級複製架構就能夠解決一主多從場景下,主庫額外的I/O和網絡壓力。 但要注意的是,多級複製場景下主庫的數據是經歷兩次纔到達讀取的從庫,期間的延時比一主多從複製場景下只經歷一次複製的要大。
建議:
    可能存在延時較長的風險
     這種方案能夠與第三方軟件結合使用,例如Slave+LVS+Keepalived 實現高可用。
三、雙主複製/Dual Master架構
場景:雙主/Dual Master架構適用於寫壓力比較大的場景,或者DBA作維護須要主從切換的場景,經過雙主/Dual master架構避免了重複搭建從庫的麻煩。
建議:
    最大問題就是更新衝突。
    能夠採用MySQL Cluster,以及將Cluster和Replication結合起來,能夠創建強大的高性能的數據庫平臺。

3、配置過程

主節點:

  • 啓用二進制日誌。
  • 爲當前節點設置一個全局惟一的server_id。
  • 建立有複製權限的用戶帳號 REPLIACTION SLAVE ,REPLIATION CLIENT。

從節點:

  • 啓動中繼日誌。
  • 爲當前節點設置一個全局惟一的server_id。
  • 配置訪問主節點的參數信息(CHANG MASTER)
  • 使用有複製權限的用戶帳號鏈接至主節點,並啓動複製線程。
#主服務器
#修改配置文件
vim /etc/my.cnf
server-id=1
添加:log-bin = mysql-bin
添加 :server-id =1
添加:innodb-file-per-table =ON
添加:skip_name_resolve=ON
添加:expire_logs_days=7
增長 :binlog_format=mixed

#登錄建立受權用戶
mysql>grant replication slave,replication clinet on *.* to 'replication'@'192.168.124.10(slave IP)' identified by '123456';
mysql>flush privileges
#拷貝數據
mysql>flush tables with read lock;
mysqldump -uroot -p1234 dy_qqopen > dy_qqopen.sql
mysql>unlock tables;

#從服務器
#修改配置文件
將 server-id=1 改爲 server-id=2
relay-log=/var/log/mysql/relaylogs
#登錄配置鏈接信息選項
mysql>change master to master_host='192.168.124.20',master_user='replication',master_password='123456',master_log_file='master-bin.000001',master_log_pos=103;
mysql> start slave; #啓動複製線程
#參考https://blog.csdn.net/daicooper/article/details/79905660

 

4、注意事項

一、配置從服務器爲只讀
     配置文件中打開 read_only=ON
    mysql -uroot -p123456 -e "FLUSH TABLES WETH READ LOCK;"
二、當從庫同時作主庫級聯時,須要打開log_slave_updates參數,不然從庫的binlog不會記錄來源於主庫的操做記錄。
三、不能在mysql配置文件裏直接寫入master的配置信息,須要用change master命令來完成
四、若是不及時清理,日積月累二進制日誌文件可能會把磁盤空間佔滿,能夠在主庫配置文件里加上expire_logs_days=7,只保留最近7天的日誌,建議當slave再也不使用時,經過從庫配置relay_log_purge=1 (打開自動清除中繼日誌)

數據庫進階

非關係型數據庫(適應web2.0時期用戶動態請求高併發場景)

鍵值對形式存儲(key-value)

典型產品:memcached(純內存)  redis

面向文檔數據庫:數據以文檔形式存儲,漱口可使用xml、json等多種形式存儲

典型產品:mongodb

相關文章
相關標籤/搜索