1. 程式人生 > >MYSQL匯總

MYSQL匯總

命令 relay skip 常見 mixed lob 最大 innodb 重啟

一.1.1 MYSQL

一.1.1.1 基礎特性

1)性能卓越,服務穩定,很少出現異常宕機;

2)開放源代碼且無版權制約,自主性強,使用成本低;

3)歷史悠久,社區及用戶非常活躍,遇到問題,可快速獲得幫助;

4)軟件體積小,安裝使用簡單,易於維護,安裝及維護成本低;

5)支持多種操作系統,提供多種API接口,支持多種開發語言,對PHP語言語言無縫支持;

6)品牌口碑效應。

一.1.1.2 基礎說明

:數據庫重新初始化要切記先刪除data對應目錄的數據。

企業環境創建數據庫:

a.根據開發的程序確定字符集(建議UTF8);

b.編譯時指定字符集,例如:

-DDEFAULT_CHATSET=utf8 \

-DDEFAULT_CHLLATION=utf8_general_ci \

c.當需要的字符集不同於默認字符集時,指定字符集創建數據庫即可。

企業環境數據庫授權狀態:

a.博客、CMS等產品的數據庫授權:

對於web連接用戶盡量采用最小化原則,較多開源軟件都是web界面安裝,需要SELECTINSERTUPDATEDELETECREATEDROP(較危險)權限;

> grant select,insert,update,delete,create,drop on blog.* to ‘blog’@’10.0.0.%’ identified by ‘000000’;

b.生成數據庫表後,要收回

CREATEDROP權限;

> REVOKE CREATE on blog.* FROM ‘blog’@’10.0.0.%’;

> REVOKE DROP on blog.* FROM ‘blog’@’10.0.0.%’;

c.生產環境針對主庫(寫為主讀為輔)用戶的授權;

主庫

> GRANT SELECT,INSERT,UPDATE,DELETE ON ‘blog’.* TO ‘blog’@’10.0.0.%’ identified by ‘000000’;

從庫

> GRANT SELECT ON ‘blog’.* TO ‘blog’@’10.0.0.%’ identified by ‘000000’;

mysql記錄

UUID的文件

[root@M-mysql /r2/mysqldata]# cat auto.cnf

[auto]

server-uuid=fda28692-9e31-11e7-bf34-000c2907c998

數據庫操作記錄文件

/root/.mysql_history

mysql參數說明

-V --version

查看版本;

-e

實現非交換式對話;

-U

當發出沒有WHERELIMIT關鍵字的UPDATEDELETE時,mysql程序將拒絕執行;

防止數據庫誤操作

# echo “alias mysql=’mysql -U’” >>/etc/profile

# source /etc/profile

不重啟數據庫調整參數

> set global key_buffer_size=10*1024*1024;

# 此操作為全局參數設置,設置完立即生效,重啟MySQL後失效,所以若想不重啟修改數據庫參數並永久生效,可用此操作設置完後再修改對應的配置文件裏參數。

登陸數據庫後執行系統命令

> system ls -la /tmp

ALL PRIVILEGES包括如下權限

SELECT, INSERT,UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

一.1.1.3 配置說明

[root@Q5 ~/ka_bak]# cat my.cnf

[client]

port = 3306

socket = /usr/local/mysql/data/mysql.sock

[mysqld]

port = 3306

socket = /usr/local/mysql/data/mysql.sock

max_connections=1000 #最大連接數

max_connect_errors=1000

#對於同一主機,若超出1000中段錯誤連接,則該主機將被禁止連接;如需解禁,執行FLUSH HOST

init-connect=‘SET NAMES utf8‘

interactive_timeout=31536000

datadir=/r2/mysqldata

basedir=/usr/local/mysql

log-error=/r2/mysqldata/mysql-error.log

pid-file=/r2/mysqldata/mysql.pid

user=mysql

key_buffer_size = 74M

#指定用於索引的緩沖區大小,對於4G內存該參數可設置為256M384M

max_allowed_packet = 64M

table_open_cache = 64

#mysql打開表時,會讀入數據到table_open_cache緩存中,當在緩存中找不到相應信息時,去磁盤上讀取

sort_buffer_size = 2M

#查詢排序時所能使用的緩沖區大小。該參數對應的分配內存是每連接獨占,若有100個連接,實際分配的總共排序緩沖區大小為100x6=600M;對於內存為4G服務器推薦設置為6-8M

read_buffer_size = 2M

#讀查詢所能使用的緩沖區大小,該參數對應的分配內存也是連接獨享

read_rnd_buffer_size = 8M

#隨機讀緩沖區大小

myisam_sort_buffer_size = 64M

thread_cache_size = 8

query_cache_size = 2M

#指定單個查詢能使用的緩沖區大小

expire_logs_days = 18

#超過18天的binlog刪除

log-bin=mysql-bin

binlog_format=mixed

innodb_buffer_pool_size = 3072M

sync_binlog=0

query_cache_type= ON

query_cache_size= 2M

gtid_mode=ON

enforce_gtid_consistency=ON

slave_parallel_type=LOGICAL_CLOCK

slave_parallel_workers=16

master_info_repository=TABLE

relay_log_info_repository=TABLE

relay_log_recovery=ON

innodb_log_file_size = 256M

innodb_log_buffer_size = 8M

innodb_flush_log_at_trx_commit = 2

sql_mode=""

[mysqldump]

quick

max_allowed_packet = 16M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 8M

sort_buffer_size = 8M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

一.1.1.4 SQL語言

一.1.1.4.1 SQL基礎

介紹

全稱為結構化查詢語言(Structured Query Language,是一種對關系數據庫中數據進行定義和操作的語言方法,用於存取數據以及查詢、更新和管理關系數據庫系統,同時也是數據庫腳本文件的擴展名,是大多數關系數據庫管理系統所支持的工業標準。

分類

數據查詢語言(DQL

DQLData Query Language),也稱為數據檢索語言,作用是從表中獲取數據,確定數據怎樣在應用程序給出,使用動詞有SELECT,保留字有WHEREORDER BYGROUP BYHAVING

數據操作語言(DML #常見

DMLData Manipulation Language,也稱為動作查詢語言,使用動詞有INSERTUPDATEDELETE,分別用於添加、修改、刪除表數據等操作;

事物處理語言(TPL

其語句能確保被DML語句影響的表的所有行及時得以更新,TPL語句包括、BGEINTRANSACTIONCOMMITROLLBACK.

數據控制語言(DCL #常見

DCLData Control Language),其語句通過GRANTREVOKE獲得許可;

數據定義語言(DDL #常見

DDLData Definition Language),其語句包括動詞CREATEDROP,創表、刪表,為表加入索引等;

指針控制語言(CCL

CCLCursor Control Language),語句包括DECLARE CURORFETCH INTOUPDATE WHERE CURRENT,用於對一個或多個表單獨行的操作。

一.1.1.4.2 SQL命令

註:

a.進行部分命令操作後應刷新授權 > flush privileges;

b.部分命令用小寫執行時會報錯;

一.1.1.4.2.1 幫助語句

註:一步一步執行以下命令,可根據幫助命令提供的信息得出所需操作對應執行的命令。

> help;

> help show;

> help revoke;

> help show grants;

> help change master to;

一.1.1.4.2.2 查看語句

查看數據庫

> show databases;

查看當前會話庫狀態

> show status;

查看全局狀態

> show global status;

查看變量

> show variables;

匹配查看變量

> show variables like ‘key_buffer%’;

查看正在執行的完整SQL語句

> show full processlist;

匹配查看庫

> show databases like ‘%zi%‘;

查看當前庫

> select database();

查看字符編碼

> show variables like ‘%character%‘;

查看當前版本

> select version();

查看當前用戶

> select user();

查看當前時間

> select now();

查看數據庫引擎

> show engines;

查看建庫語句

> show create database kazihuo\G;

查看建表語句

> show create table kazihuo\G;

查看表

> show tables;

查看表結構

> desc mysql.user;

一.1.1.4.2.3 查詢語句

查詢用戶信息

mysql> select user,host from mysql.user;

查詢授權列表

> SELECT DISTINCT CONCAT(‘User: ‘‘‘,user,‘‘‘@‘‘‘,host,‘‘‘;‘) AS query FROM mysql.user;

> select * from mysql.user where user=‘root‘ \G;

查看指定用戶授權信息

mysql> SHOW GRANTS FOR ‘root‘@‘localhost‘;

查詢表數據

> select *from student;

指定字段查詢

> select id,name from student;

條件查詢

> select *from student limit 2; #只查詢2條記錄

> select *from student where id=1; #指定字段數據查詢

> select *from student where id>2 and id <4;

> select *from student order by age asc; #正序

> select *from student order by age desc; #倒敘

多表查詢

> select student.Sno,student.Sname,course.Cname,SC.Grade from student,course,SC where student.Sno=SC.Sno and course.Cno=SC.Cno;

查看sql語句執行計劃

> explain select *from test where name=’kazihuo’\G;

一.1.1.4.2.4 使用語句

連接庫

> use kazihuo;

一.1.1.4.2.5 創建語句

創建用戶

> create user luomr@localhost identified by ‘000000‘;

創庫

> create database kazihuo;

創建指定字符集數據庫(默認為拉丁字符集)

> create database kazihuo_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

> create database kazihuo_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

創表

mysql> create table student(

-> id int(4) not null,

-> name char(20) not null,

-> age int(3) not null default ‘0‘,

-> dept varchar(16) default null

-> );

> create table worker(id int,name varchar(10),sex enum(‘man‘,‘woman‘));

一.1.1.4.2.6 插入語句

指定字段插入數據

> insert into student(id,name) values(1,‘kazihuo‘);

不指定字段將按照表格式依次插入數據

> insert into student values(2,‘ka‘,23,‘boy‘);

多條記錄插入

mysql> insert into student values(3,‘zi‘,3,‘man‘),(4,‘huo‘,33,‘superman‘);

一.1.1.4.2.7 修改語句

修改表

>update dns_domain_info set domain_info=replace(domain_info,"192.168.53.71","10.79.6.52");

> update dns_domain_info set domain_info=‘192.168.11.11‘ where domain_info=‘192.168.101.106‘;

指定字段信息修改表信息

> update student set name=‘tom‘ where id=2;

修改表名

> rename table teacher to teacher1;

> alter table teacher1 rename to teacher;

一.1.1.4.2.8 刪除語句

刪除庫

> drop database kazihuo;

刪除系統賬號

> drop kazihuo ‘root’@’localhost’;

> delete from mysql.user where user=’kazihuo’ and host’localhost’; #drop刪除無效時使用

刪除指定字符串

#delete from homed_iusm.account_info where nickname like "%test%"

一.1.1.4.2.9 清空語句

清空表中所有內容

> truncate table teacher;

> delete from teacher;

# truncate更快,清空物理文件;delete為邏輯清除,按行刪;

一.1.1.4.2.10 字段語句

添加字段

指定位置添加,默認為末尾

> alter table student add qq varchar(20) after id;

> alter table student add qq varchar(20) first;

添加多個字段

> alter table student add qq varchar(20),add grant int;

修改字段

ALTER TABLE 表名

MODIFY 字段名 數據類型 [完整性約束條件…];

ALTER TABLE 表名

CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…];

ALTER TABLE 表名

CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];

一.1.1.4.2.11 權限語句

用戶授權

> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘luomr‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

公司授權

> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘localhost‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘127.0.0.1‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

#所有IP可通過root賬號,passwd密碼登陸

[root@slave1 src]# mysql -uroot -ppasswd -e "GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘passwd‘ WITH GRANT OPTION"

[root@slave1 src]# mysql -uroot -ppasswd -e "GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘127.0.0.1‘ IDENTIFIED BY ‘passwd‘ WITH GRANT OPTION"

[root@slave1 src]# mysql -uroot -ppasswd -e "GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘‘localhost‘‘ IDENTIFIED BY ‘passwd‘ WITH GRANT OPTION"

局域網內主機授權

# 百分號匹配法

> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘192.168.11.%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

# 子網掩碼配置法

> GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘192.168.11.0/24‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;

一.1.1.4.2.12 密碼操作

修改密碼

# mysqladmin -uroot -p000000 password ‘111111‘

> update mysql.user set authentication_string=password(‘newpass‘) where user=‘root‘ and host=‘localhost‘;

> set password = password(‘xxxxxxxx‘);

> flush privileges;

忘記密碼

# /etc/init.d/mysqld stop

# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql &

# 多實例跳過密碼啟動

#/usr/local/mysql/bin/mysqld_safe --skip-grant-tables --defaults-file=/data/3306/my.cnf &

進入mysql後用update方式設置密碼

> flush privileges;

若重新登錄mysql時仍不需要密碼,則需重啟mysql

一.1.1.5 數據遷移

一.1.1.6 數據備份

刷新binlog

# mysqldump -uroot -p000 flush-log

鎖表

> flush table with read lock;

解鎖

> unlock tables;

一.1.1.6.1 備份命令

生產場景常規備份

# mysqldump -uroot -p000 --set-gtid-purged=OFF --master-data=2 -A -B |gzip> /tmp/bak`date +%F-%T`.sql.gz

# mysqldump -uroot -p000 --all-databases --routines --events >/r2/baksql_`date +"%Y%m%d"`.sql

分引擎備份(專業DBA提供)

myisam

# mysqldump -uroot -p000 -A -E -R -F -x --flush-privileges --master-data=1 --hex-blob --set-gtid-purged=OFF >/tmp/`date +%F-%T`_all.sql

innodb(推薦使用)

# mysqldump -uroot -p000 -A -E -R -F --single-transaction --flush-privileges --master-data=1 --hex-blob --set-gtid-purged=OFF|gzip >/tmp/all_`date +%F-%T`.sql.gz

# mysqldump -uroot -p000 -A -E -R -F --single-transaction --flush-privileges --master-data=1 --hex-blob --set-gtid-purged=OFF >/tmp/all_`date +%Y%m%d`.sql

分庫備份

# mysqldump -uroot -p000 --set-gtid-purged=OFF -B $db > "$bakpath"/bak_"$db"_`date +%F-%T`.sql

# 配合for語句實現分庫備份

腳本備份

# mysql -uroot -p000 -e "show databases;"|grep -ivE "database|infor|performance|sys|mysql"|sed ‘s/^/mysqldump -uroot -p000 -B /g‘

命令行執行命令實現分庫備份並壓縮

# mysql -uroot -p000 -e "show databases;"|grep -ivE "database|infor|performance|sys|mysql"|sed -r ‘s#^([a-zA-Z].*$)#mysqldump -uroot -p000 --set-gtid-purged=OFF -B \1|gzip >/tmp/\1.sql.gz#g‘|bash

SQL精簡(過濾註釋)

# egrep -v "#|\*|--|^$" all.sql

-set-gtid-purged=OFF 說明

當執行mysqldump不加以上參數時發出警告

雖然能備份成功,但是在之後的數據恢復時報錯

需註釋報錯行方可成功導入數據,而當加了以上參數時,將不會出現以上問題,同時數據也可正常導入。

MySQL5.6版本後,官方加入了全局事物IDGTID)來強化數據庫的主備一致性,故障恢復及容錯能力;

官方解釋:

A global transaction identifier (GTID) is a unique identifier created and associated with each transaction committed on the server of origin (master).

全局事務標識符(GTID)是一個惟一的標識符,它與在源服務器上提交的每個事務相關聯()

一.1.1.6.2 mysqldump

部分常用參數說明

-u --user
指定連接的用戶名;

-p --password
連接數據庫密碼

-h --host
需要導出的主機信息

-P --port
連接數據庫端口號

-A --all-databases
導出全部數據庫;

-B --databases

表示接多個庫,且增加use db、create db的信息(即恢復數據時不需指定庫、表);

-S --socket
指定連接mysql的socket文件位置;

-x --lock-all-tables
提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個 全局讀鎖,並且自動關閉--single-transaction和--lock-tables選項;
-Y --all-tablespaces
導出全部表空間;

-F --flush-logs
開始導出之前刷新日誌;
一次導出多個數據庫(使用選項--databases或者--all-databases), 將會逐個數據庫刷新日誌。除使用 --lock-all-tables或者--master-data 外。在這種情況下,日誌將會被刷新一次,相應的所有表同時被鎖定。因此, 如果打算同時導出和刷新日誌應該使用--lock-all-tables或者 --master-data和--flush-logs;

-d --no-data
不導出任何數據,只導出數據庫表結構;

-t --no-create-info

只備份數據;

-V --version
輸出mysqldump版本信息並退出;

-X --xml
導出XML格式;

--default-character-set
設置默認字符集,默認值為utf8;
eg:mysqldump -uroot -p --all-databases --default-character-set=latin1

--compact
導出更少的輸出信息(用於調試),去掉註釋和頭尾等結構;

--master-data

binlog位置和文件名追加輸入文件,如果為1,將會輸出CHANGE MASTER命令;如果為2,輸出的 CHANGE MASTER命令前添加註釋信息;

--hex-blob

使用十六進制格式導出二進制字符串字段。如果有二進制數據就必須使 用該選項,影響到的字段類型有BINARY、VARBINARY、BLOB;

--flush-privileges

在導出mysql數據庫之後,發出一條FLUSH PRIVILEGES語句。為了正確 恢復,用於導出mysql數據庫和依賴mysql數據庫數據的任何時候;

--triggers

導出觸發器(默認啟用,用--skip-triggers禁用);

-R --routines

導出存儲過程以及自定義函數;

-E --events
導出事件;
-y --no-tablespaces
不導出任何表空間信息;


一.1.1.7 數據恢復

一.1.1.7.1 恢復操作

恢復方式

方法一:

mysql>use $db;

mysql>set names utf8;

mysql>source /tmp/bak.sql;

方法二:

#mysql -uroot -p000 $db < bak.sql

一.1.1.7.2 bin-log

基礎說明

MySQLbinlog存在於數據庫的數據目錄下;

其作用是:

用來記錄mysql內部增刪改查等對mysql數據庫有更新的內容的記錄。

參數說明

-d

截取指定庫的binlog

解析binlog日誌

[root@Q5 /r2/mysqldata]# mysqlbinlog mysql-bin.000003 > bin.sql

導出指定庫的對應sql操作

# mysqlbinlog -d kazihuo mysql-bin.000010 >kazihuo.sql

一.1.1.7.3 增量恢復
一.1.1.7.3.1 基於位置點

指定開始位置和結束位置

# mysqlbinlog msql-bin.000020 --start-position=510 --stop-position=1312 -r pos.sql

# 輸出初始位置510,結束位置1312的所有binlog日誌到pos.sql;

:結尾日誌點將不被包含(即輸出1312pos之前的binlog),位置信息點要實際存在。

-r 選項相當於重定向;

指定開始位置到文件結束

# mysqlbinlog msql-bin.000020 --start-position=510 -r pos510-end.sql

同時也可指定庫名輸出binlog

# mysqlbinlog msql-bin.000020 --start-position=510 -r pos510-end.sql -d kazihuo

從文件開頭到指定結束位置

一.1.1.7.3.2 基於時間點

一.1.1.8 多實例化

註:多實例執行mysql命令時要指定sock文件。

一.1.1.8.1 配置方案

通過配置多個配置文件及多個啟動程序實現多實例方案;

配置:

[root@Q1 /]# tree /data/

/data/

├── 3306

│ ├── data #數據文件

│ ├── my.cnf #配置文件

│ └── mysql #啟動文件

└── 3307

├── data

├── my.cnf

└── mysql

配置文件對比

一.1.1.8.2 安裝部署

# groupadd mysql

# useradd -r -s /sbin/nologin g mysql mysql

# tar axvf mysql-5.7.18

# mv mysql-5.7.18 /usr/local/mysql

# chown -R mysql.mysql /data

# find /data/ -type f -name “mysql”|xargs ls -l

# find /data/ -type f -name “mysql”|xargs chmod +x

# cd /usr/local/mysql/bin

#./mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data

#./mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data

常用初始化命令

# ./mysqld --initialize-insecure --user=mysql --datadir=/r2/mysqldata --basedir=/usr/local/mysql

環境變量

方式一

# echo ‘export PATH=/usr/local/mysql/bin:$PATH ’ >> /etc/profile

# echo後必須為單引號

# source /etc/profile

方式二

/usr/local/mysql/bin下面命令cp到全局系統命令路徑/usr/local/sbin也可,或者做link

*************************************************************

a.初始化數據庫原因:

初始化的目的是創建基礎的數據庫文件(生成mysql庫表等);

初始化後對應實例數據目錄下生成文件;

一.1.1.8.3 服務啟停

:盡量不要野蠻的方式殺死數據庫,生產高並發環境可能會引起數據丟失。

多實例啟動文件的啟動mysql

# mysql_safe --defaults-file=/data/3306/my.cnf 2>&1 >/dev/null &

# mysql_safe --defaults-file=/data/3307/my.cnf 2>&1 >/dev/null &

多實例啟動文件的停止mysql(平滑停止)

# mysqladmin -uroot -p000000 -S /data/3306/mysql.sock shutdown

# mysqladmin -uroot -p000000 -S /data/3307/mysql.sock shutdown

一.1.1.8.4 服務登陸

#mysql -uroot -p00000 -S/data/3306/mysql.sock

#mysql -uroot -p00000 -S/data/3307/mysql.sock

一.1.1.9 問題說明

一.1.1.9.1 登陸報錯

問題描述

數據庫正常啟動,登陸時顯示

[root@M-mysql ~]# mysql -uroot -p000000

-bash:mysql:未找到命令

解決方案

配置了mysql的環境變量未生效,執行# source /etc/profile

一.1.1.9.2 表操作報錯

問題描述

登陸數據庫打開表時報錯:can’t create/write to file ‘tmp#sql_23e6_0MYI’

解決方案

# mkdir /var/lib/mysql/tmp

# chown mysql.mysql /var/lib/mysql/tmp

# vim /etc/my.cnf

tmp=/var/lib/mysql/tmp

# /etc/init.d/mysql restart

#查看指定目錄大小:

# df -h /tmp

以上問題實操解決

一.1.1.9.3 關機卡死

問題描述

虛擬機部署了mysql5.7之後關機卡在如下頁面:

解決方案

# swapon -s

# free -h

# df -h /dev/shm

# grep -i huge /proc/meminfo

查看swap使用超過50%

出現此問題可能是服務器內存不足導致,可增大內存或者修改my.cnf將參數要求值降低,可解決此問題。

一.1.1.9.4 刪除binlog無法啟動

問題描述

當磁盤空間不足,刪除mysqldata下的binlog後導致數據庫無法正常啟動。

解決方案

清空binlog索引文件即可

[root@M-mysql /r2/mysqldata]# > mysql-bin.index

一.1.1.10 主從同步

一.1.1.10.1 主從復制原理

a.slave數據庫上執行start slave,開啟主從復制開關;

b.slaveI/O線程通過在master上的授權的復制用戶權限請求連接master服務器,並請求從指定binlog日誌文件的指定位置(日誌文件名和位置就是在配置主從復制時執行change master命令時指定的)之後發送binlog日誌內容;

c.master收到請求後,負責復制的I/O線程根據請求提供相應binlogslave

d.slave收到信息後,將binlog寫入到自身中繼日誌(Relay Log)文件(MySQL-relay-bin.xxx)的最末端,並將新的binlog文件名和位置記錄到master-info文件(便於下次讀取masterbinlog日誌時能告訴master服務器需要從新binlog日誌的哪個文件哪個位置開始請求新的binlog日誌內容)。

e.slave通過SQL線程將log文件內容解析成SQL語句並執行,應用完畢後清理用過的日誌;

說明

從服務器上生成的master.info是給I/O線程使用,relay-log.INFOSQL線程使用。

一.1.1.10.2 實現主從同步

主庫操作

建立從庫復制的賬號rep

> grant replication slave on *.* to ‘rep‘@‘192.168.11.%‘ identified by ‘master‘;

> show master status;

+------------------+----------+--------------+------------------+---------------------------------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+---------------------------------------------+

| mysql-bin.000021 | 791| | fda28692-9e31-11e7-bf34-000c2907c998:1-1132 |

+------------------+----------+--------------+------------------+---------------------------------------------+

# mysqldump -uroot -pmaster -A -E -R -F --single-transaction --flush-privileges --master-data=1 --hex-blob --set-gtid-purged=OFF >/tmp/all_`date +%Y%m%d`.sql

將備份的sql同步到從庫

說明:當主庫備份時加了--master-data=1時,在生成的sql裏面包含了對應的binlog信息及指定的position,所有在從庫上執行CHANGE MASTER TO時可省略MASTER_LOG_FILE=‘mysql-bin.000021‘,MASTER_LOG_POS=791;

從庫操作

CHANGE MASTER TO

MASTER_HOST=‘192.168.11.17‘,

MASTER_USER=‘rep‘,

MASTER_PASSWORD=‘master‘,

MASTER_PORT=3306,

MASTER_LOG_FILE=‘mysql-bin.000021‘,

MASTER_LOG_POS=791;

> start slave;

檢驗是否成功

> show slave status;

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

當顯示以上信息,同時在master上對數據進行操作時,對應的slave數據庫有著對應操作的結果體現。

MYSQL匯總