一. Mysql多實例編譯安裝mysql
-------------------------------------c++
1.多實例定義:web
同一套mysql程序,不一樣的「my.cnf,啓動程序,端口」。屬於邏輯上面的多實例。sql
2.下載mysql-5.5.32.tar.gz數據庫
3.安裝相關依賴:vim
yum install ncurses-devel libaio-devel cmake gcc-c++服務器
4.建立用戶:多線程
useradd mysql -s /sbin/nologin -M架構
5.解壓縮開始編譯: socket
- cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.5.32/ -DMYSQL_DATADIR=/data/mysql \
- -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.5.32/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \
- -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii -DENABLED_LOCAL_INFILE=ON -DWITH_INNOBASE_STORAGE_ENGINE=1 \
- -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
- -DWITHOUT_PARTITION_STORAGE_ENGINE=1 -DWITH_FAST_MUTEXES=1 -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 \
- -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_DEBUG=0
make&&make install
6.建立實例目錄:
mkdir -p /data/{3306,3307}/data
7.建立配置文件:
PS:server-id 每一個實例要不同。
vim /data/3306/my.cnf
- [client]
- port = 3306
- socket = /data/3306/mysql.sock
-
-
- [mysql]
- no-auto-rehash
-
-
- [mysqld]
- user = mysql
- port = 3306
- socket = /data/3306/mysql.sock
- basedir = /usr/local/mysql-5.5.32
- datadir = /data/3306/data
- open_files_limit = 1024
- character-set-server = utf8
- back_log = 600
- max_connections = 800
- max_connect_errors = 3000
- table_cache = 614
- external-locking = FALSE
- max_allowed_packet =8M
- sort_buffer_size = 1M
- join_buffer_size = 1M
- thread_cache_size = 100
- thread_concurrency = 2
- query_cache_size = 2M
- query_cache_limit = 1M
- query_cache_min_res_unit = 2k
- #default_table_type = InnoDB
- thread_stack = 192K
- #transaction_isolation = READ-COMMITTED
- tmp_table_size = 2M
- max_heap_table_size = 2M
- long_query_time = 1
- #log_long_format
- #log-error = /data/3306/error.log
- #log-slow-queries = /data/3306/slow.log
- pid-file = /data/3306/mysql.pid
- log-bin = /data/3306/mysql-bin
- relay-log = /data/3306/relay-bin
- relay-log-info-file = /data/3306/relay-log.info
- binlog_cache_size = 1M
- max_binlog_cache_size = 1M
- max_binlog_size = 2M
- expire_logs_days = 7
- key_buffer_size = 16M
- read_buffer_size = 1M
- read_rnd_buffer_size = 1M
- bulk_insert_buffer_size = 1M
- #myisam_sort_buffer_size = 1M
- #myisam_max_sort_file_size = 10G
- #myisam_max_extra_sort_file_size = 10G
- #myisam_repair_threads = 1
- #myisam_recover
-
-
- lower_case_table_names = 1
- skip-name-resolve
- slave-skip-errors = 1032,1062
- #replicate-ignore-db = mysql
-
-
- server-id = 1
-
-
- innodb_additional_mem_pool_size = 4M
- innodb_buffer_pool_size = 16G #設置成內存的一半最好
- innodb_data_file_path = ibdata1:128M:autoextend
- innodb_file_io_threads = 4
- innodb_thread_concurrency = 8
- innodb_flush_log_at_trx_commit = 2
- innodb_log_buffer_size = 2M
- innodb_log_file_size = 4M
- innodb_log_files_in_group = 3
- innodb_max_dirty_pages_pct = 90
- innodb_lock_wait_timeout = 120
- innodb_file_per_table = 0
- [mysqldump]
- quick
- max_allowed_packet = 2M
-
-
- [mysqld_safe]
- log-error=/data/3306/mysql_3306.err
- pid-file=/data/3306/mysqld.pid
vim /data/3307/my.cnf
- [client]
- port = 3307
- socket = /data/3307/mysql.sock
-
-
- [mysql]
- no-auto-rehash
-
-
- [mysqld]
- user = mysql
- port = 3307
- socket = /data/3307/mysql.sock
- basedir = /usr/local/mysql-5.5.32
- datadir = /data/3307/data
- open_files_limit = 1024
- character-set-server = utf8
- back_log = 600
- max_connections = 800
- max_connect_errors = 3000
- table_cache = 614
- external-locking = FALSE
- max_allowed_packet =8M
- sort_buffer_size = 1M
- join_buffer_size = 1M
- thread_cache_size = 100
- thread_concurrency = 2
- query_cache_size = 2M
- query_cache_limit = 1M
- query_cache_min_res_unit = 2k
- #default_table_type = InnoDB
- thread_stack = 192K
- #transaction_isolation = READ-COMMITTED
- tmp_table_size = 2M
- max_heap_table_size = 2M
- #long_query_time = 1
- #log_long_format
- #log-error = /data/3307/error.log
- #log-slow-queries = /data/3307/slow.log
- pid-file = /data/3307/mysql.pid
- #log-bin = /data/3307/mysql-bin
- relay-log = /data/3307/relay-bin
- relay-log-info-file = /data/3307/relay-log.info
- binlog_cache_size = 1M
- max_binlog_cache_size = 1M
- max_binlog_size = 2M
- expire_logs_days = 7
- key_buffer_size = 16M
- read_buffer_size = 1M
- read_rnd_buffer_size = 1M
- bulk_insert_buffer_size = 1M
- #myisam_sort_buffer_size = 1M
- #myisam_max_sort_file_size = 10G
- #myisam_max_extra_sort_file_size = 10G
- #myisam_repair_threads = 1
- #myisam_recover
-
-
- lower_case_table_names = 1
- skip-name-resolve
- slave-skip-errors = 1032,1062
- #replicate-ignore-db = mysql
-
-
- server-id = 3
-
-
- innodb_additional_mem_pool_size = 4M
- innodb_buffer_pool_size = 16G #設置成內存的一半
- innodb_data_file_path = ibdata1:128M:autoextend
- innodb_file_io_threads = 4
- innodb_thread_concurrency = 8
- innodb_flush_log_at_trx_commit = 2
- innodb_log_buffer_size = 2M
- innodb_log_file_size = 4M
- innodb_log_files_in_group = 3
- innodb_max_dirty_pages_pct = 90
- innodb_lock_wait_timeout = 120
- innodb_file_per_table = 0
- [mysqldump]
- quick
- max_allowed_packet = 2M
-
-
- [mysqld_safe]
- log-error=/data/3307/mysql_3307.err
- pid-file=/data/3307/mysqld.pid
8.建立啓動腳本:
vim /data/3306/mysql
#3307只要改動port參數就能夠
- #!/bin/sh
-
- #init
- port=3306
- mysql_user="root"
- mysql_pwd="Root123"
- cmdpath="/usr/local/mysql-5.5.32/bin"
- mysql_sock="/data/${port}/mysql.sock"
- #startup function
- function_start_mysql()
- {
- if [ ! -e "$mysql_sock" ];then
- echo "starting mysql…"
-
-
- /bin/sh ${cmdpath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /devull &
- else
- echo "mysql is running…"
- exit
- fi
- }
-
- #stop function
- function_stop_mysql()
- {
- if [ ! -e "$mysql_sock" ];then
- echo "mysql is stopped…"
- exit
- else
- echo "stoping mysql…"
- ${cmdpath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
- fi
-
-
- }
-
- #restart function
- function_restart_mysql()
- {
- echo "restarting mysql…"
- function_stop_mysql
- sleep 2
- function_start_mysql
- }
-
- case $1 in
-
- start)
-
- function_start_mysql
- ;;
-
- stop)
-
- function_stop_mysql
- ;;
-
- restart)
-
- function_restart_mysql
- ;;
-
- *)
- echo "usage: /data/${port}/mysql {start|stop|restart}"
- esac
9.修改目錄權限:
chown -R mysql:mysql /data/
find /data -type f -name mysql -exec chmod 700 {} \;
10.添加環境變量:
echo 'export PATH=/usr/local/mysql-5.5.32/bin/:$PATH' >> /etc/profile
11.初始化數據庫:
cd /usr/local/mysql-5.5.32/scripts/
./mysql_install_db --basedir=/usr/local/mysql-5.5.32/ --datadir=/data/3306/data/ --user=mysql
./mysql_install_db --basedir=/usr/local/mysql-5.5.32/ --datadir=/data/3307/data/ --user=mysql
12.啓動數據庫:
/data/3306/mysql start
/data/3307/mysql start
13.設置數據庫root密碼:
mysqladmin -uroot password Root123 -S /data/3306/mysql.sock
mysqladmin -uroot password Root456 -S /data/3307/mysql.sock
14.登錄數據庫:
mysql -uroot -pRoot123 -S /data/3306/mysql.sock
mysql -uroot -pRoot456 -S /data/3307/mysql.sock
15.遠程登錄數據庫:
mysql -uroot -pRoot123 -h 172.16.1.214 -P 3306
二. Mysql主從複製基礎
-------------------------------------
1.主動複製架構圖:


2.主從複製流程圖:

3.主從複製條件:
#咱們下面的操做是多實例主從複製,3306爲主庫,3307爲從庫。
主庫要開啓log-bin,主庫和從庫的server-id要不同。
4.在主庫上面建立同步用戶:
mysql> grant replication slave on *.* to 'rep'@'172.16.1.%' identified by 'Root1234'; #後面的密碼要設置複雜些。
mysql> flush privileges;
5.導出主庫數據文件:
- 一。常規方法:
- mysql> flush table with read lock; #先鎖表,鎖表後不能退出mysql窗口,不然失效
- mysql> show master status; #記錄bin-log的位置信息
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000004 | 560 | | |
- +------------------+----------+--------------+------------------+
- mysqldump -uroot -pRoot123 -S /data/3306/mysql.sock --events -A -B|gzip >/tmp/bak_$(date +%F).sql.gz
- mysql> unlock tables; #解鎖數據庫
-
- 二。快捷方法:
- mysqldump -uroot -pRoot123 -S /data/3306/mysql.sock --events -A -B -F --master-data=2 -x|gzip >/tmp/bak_f_$(date +%F).sql.gz
- -x 自動鎖表
- -F --master-data=2 以備註形式記錄bin-log的位置。(能夠打開文件看頭部備註信息)
6.還原備分內容到從庫:
gzip -d bak_2016-12-02.sql.gz
mysql -uroot -pRoot456 -S /data/3307/mysql.sock < bak_2016-12-02.sql
7.在從庫建立master_info文件,並啓動同步:
- mysql -uroot -pRoot456 -S /data/3307/mysql.sock <<EOF
- CHANGE MASTER TO
- MASTER_HOST='172.16.1.214',
- MASTER_PORT=3306,
- MASTER_USER='rep',
- MASTER_PASSWORD='Root1234',
- MASTER_LOG_FILE='mysql-bin.000004',
- MASTER_LOG_POS=560;
- EOF
-
- mysql> start slave; #開啓同步
- mysql> show slave status \G ; #查看同步狀態信息
8.監控mysql主從複製的狀態指標:
mysql -uroot -pRoot456 -S /data/3307/mysql.sock -e "show slave status \G ;" | egrep -i "_Running|_Behind"
Slave_IO_Running: Yes #同步進程是否啓動
Slave_SQL_Running: Yes #sql進程是否啓動
Seconds_Behind_Master: 0 #從庫同步完成須要的時間
三. Mysql主主複製+讀寫分離進階
--------------------------------------------------------------------
1.若是出現同步錯誤,須要忽略錯誤,進行下條語句繼續同步。
- mysql> stop slave;
- mysql> set global sql_slave_skip_counter =1;
- mysql> start slave
2.經過配置文件自動忽略同步錯誤「1007」,生產環境主從分離要用:
vim /data/3307/my.cnf
slave-skip-errors = 1032,1062,1007,1008
3.讓從庫開啓bin_log的辦法:
vim /data/3307/my.cnf
- log-slave-updates
- log-bin = /data/3307/mysql-bin
- expire_logs_days = 7 #日誌只保留7天
4,.雙主庫同步方案:
a.讓表的ID自增,讓主1寫1,3,5 主2 寫2,4,6。
- A增長:
- auto_increment_increment = 2
- auto_increment_offset=1
- B增長:
- <p> b.不讓表的ID自增,經過WEB程序去seq服務器取ID,寫入雙主。</p>
5.讀寫分離的方案:
a.經過開發的程序控制讀寫的位置。 (推薦)
b.經過開源軟件實現。(Amoeba,Mysql_proxy)
c.本身開發DAL層。(大公司用)
6.增量備份步驟:
一。選擇一臺從庫,不對外提供業務,專門用了作備份。此從庫開啓bin_log功能,作增量備份。
二。備份的時候須要中止sql線程,在用mysqldump備份:
stop slave sql_thread; #中止sql線程,不會中止同步IO進程
三。而後將備份文件和bin_log文件遠程保存起來。
下面命令能夠用來遠程備份bin_log:
mysqlbinlog --read-from-remote-server --raw --host=172.16.1.214 --port=3306 --user=rep --password=Root1234 --stop-never mysql-bin.000001
7.主從複製延時緣由:
a.從庫太多,通常要3-5個
b.從庫配置過低。
c.慢sql過多。
d.高版本mysql支持多線程複製
8.同一帳號在主從庫擁有不一樣權限方案:
a.在主庫上建立擁有讀寫權限帳號,而後再從庫上面收回寫入權限。
mysql> grant insert,update,delete,select on *.* to web@'172.16.1.%' identified by '123'; #建立web用戶對全部表擁有讀寫權限,主庫執行。
mysql> show grants form web@'172.16.1.%'; #查看用戶權限
mysql> REVOKE insert,update,delete ON *.* FROM 'web'@'172.16.1.%'; #回收web用戶寫入權限,從庫執行
b.從庫不一樣步mysql受權表:(推薦方案)
my.cnf 裏面加:
replicate-ignore-db = mysql
binlog-ignore-db = mysql
c.在從庫設置read-only:
mysql> set global read_only=1;
或者 my.cnf 加 read-only
四. Mysql 災難恢復演練
--------------------------------------------------------------------
1.主庫當機從庫接管方案:
a.半同步從庫(谷歌半同步插件)。
b.選一臺從庫什麼都不幹,等着接管。
c.當機後選舉一臺從庫來當主庫。
2.查看從庫的同步狀態:
mysql> show processlist\G;
3.手動從庫提高成主庫的步驟:
a.中止同步,重置master。
mysql> stop slave ;
mysql> reset master;
b.刪除目錄文件裏面的master.info 和 relay-bin。
c.取消read-only設置,確認bin-log是否開啓。
d.重啓數據庫。
PS: 有一個軟件「MHA」能夠自動實現上面操做。
4.mysql的高可用方案:
MYSQL+HA+DRBD
MYSQL+MHA