1. 程式人生 > >Linux - mysql基礎語法(李作強)

Linux - mysql基礎語法(李作強)

資料庫的四個特性(ACID):
1)原子性(A):整個事物中的所有操作,要麼完成,要麼全部不完成,不能停留在某個細節,在執行中發生錯誤,會被回滾到事物最開始狀態,就行事物沒發生過一樣。
2)一致性(C):一個事務可以封裝狀態改變,事務必須始終保持系統處於一致的狀態,不管在任何給定的時間併發事務有多少。
3)隔離性(I):是指兩個以上的事務不會出現交錯執行的狀態,因為這樣可能會導致資料不一致。
4)永續性(D):在事務完成以後,該事務對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。
事物:一般是指要做或者所做的事情。
多人操作同一條資料,會產生死鎖或者鎖等待。
行級鎖:MySQL中粒度最小的一種鎖,他能減少資料庫操作的衝突

解決死鎖的三種方法:
1)逐個殺死程序
2)指令碼殺死程序
3)重啟資料庫,重啟伺服器

回滾(Rollback):程式或者資料發生錯誤,將程式或者資料恢復到上一次正確的狀態的行為。
redo(提交日誌):忽略未完成的事務並重復已提交事務所做的改變
undo(回滾日誌):在恢復時消除未完成事務的影響並忽略已提交事務。
Engine(儲存引擎):mySAM & InnoDB
mySAM :處理速度快,但是不支援事物,不能回滾
InnoDB : 支援事物,支援行級鎖,支援外來鍵,處理小資料是比mySAM慢,處理大資料還可以,能回滾
NDB:給cluster叢集用的引擎
SQL語言包括四種主要程式設計語言類別的語句:資料定義語言(DDL),資料操作語言(DML),資料控制語言(DCL),事務控制語言(TCL)。

安裝MySQL
要把所有關於MySQL的程序和程式包和使用者名稱全部殺死,刪除。
解壓安裝包。
執行安裝包裡的install指令碼。
編輯配置檔案:/etc/my.conf

查詢指定記錄,where關鍵字
select 欄位名1,欄位名2,… from 表 where 查詢條件; //按條件查詢

MySQL字符集
檢視字符集的設定
show variables like ‘character_set_%’;
檢視字符集排序設定
show variables like ‘collation_%’;
修改MySQL字符集(變成中文)
vim /etc/my.cnf
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
character-set-filesystem = utf8 //如果想要都是utf8,檔案系統也可設定
[mysql]
default-character-set=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES //找到這行註釋。
檢視資料庫編碼:
show create database 庫名;
查看錶編碼:
show create table 表名;
檢視欄位編碼:
show full columns from 表名;
修改伺服器級別字符集
a.臨時修改
set character_set_server=utf8;
b.永久修改
set global character_set_server=utf8; #第一種方法,但需要退出之後,在進入才可看到改變
第二種方法,但需要重啟
vim /etc/mysql/my.cnf
[mysqld]
default-character-set=utf8

許可權管理
use mysql; //登入資料庫
select * from user \G //檢視資料庫使用者許可權資訊,\G把表豎起檢視。
describe user; // 描述資料庫使用者許可權資訊。
select * from db \G //檢視資料庫庫的許可權資訊。
describe user; //描述資料庫庫的許可權資訊。
flush privileges; //重新整理使用者許可權記錄
show databases; //檢視資料庫所有的庫。
show tables; //檢視庫裡的所有表
use 庫名; //登入超級資料庫
mysql所有庫許可權由以下5個表控制
user:控制使用者許可權
db:控制資料庫許可權
host:控制訪問主機
tables_priv:控制表許可權
columns_priv:控制列許可權
mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) values(‘192.168.0.103’,’wml’,password(‘123’),”bolb’,’bolb’.’bolb’); //新增資料庫的使用者。
update user set select_priv=”Y”; //給使用者新增檢視許可權,“select_priv”是檢視的許可權。
update user set select_priv=”N” where user=”wml”; //關閉使用者的許可權。where是抽取條件。
insert into db(host,db,user,select_priv) values(‘192.168.0.103’,’db1’,’wml’,’Y’); //在db中插入“主機”,“資料庫名”,“使用者名稱”,“需要修改的許可權”。
privileges:特權。
grant:授權。
revoke:撤銷。
grant 許可權 privileges on 資料庫.表名 to 使用者名稱@’可登陸伺服器IP’ identified by ‘password (‘密碼’)’; //給使用者授予許可權,密碼加密。
grant 許可權 on 資料庫.表名 to 使用者名稱@’可登陸伺服器IP’ identified by ‘password (‘密碼’)’; //給使用者授權,密碼加密。
例項:
grant select,insert on mysql.user to [email protected]’192.168.0.100’ identified by ‘password (‘123’)’; // 給資料庫使用者wml,授予檢視,插入的許可權,並設定密碼。
grant all privileges on . to 使用者名稱@’%’ with grant option; //給使用者所有許可權,包括 grant 許可權,全域性級別。
grant 許可權 on 庫名.* to 使用者名稱@’主機範圍’; //資料庫級別
grant 許可權 on 庫名.表名 to 使用者名稱@’主機範圍’; //表級別
grant 許可權(欄位名) on 庫名.表名 to 使用者名稱@’主機範圍’; //欄位級別
grant insert(name) on db2.tb1 to [email protected]’%’; //欄位級別的例項。
grant all on . to [email protected]’192.168.0.10’ identified by “123”; //給使用者所有許可權,唯grant許可權沒有,dba1是使用者名稱,192.168.0.10是主機IP,identified by 設定密碼。

使用者管理
1)create user 使用者名稱 identified by ‘密碼’; //新增使用者。
2)grant 許可權 on 資料庫物件 to 使用者@’主機範圍’ identified by “密碼”; //建立使用者,給使用者名稱授權。
3)insert into mysql.user(host,user,password) values(‘主機範圍’,’使用者名稱’,password(‘密碼’)); //在系統裡插入使用者,建立使用者。
select distinct concat(‘User: ”’,user,”’@”’,host,”’;’) as query from mysql.user; //檢視資料庫中所有使用者
show grants; //檢視使用者的許可權
show grants for 使用者名稱; //檢視建立後的授權語句。
select * from mysql.user where user=’使用者名稱’ \G; //檢視資料庫中某個使用者許可權
drop user 使用者名稱; //刪除使用者
delete from mysql.user where user = ‘使用者名稱’; //刪除使用者
revoke 許可權(欄位名) on 庫名.表名 from 使用者名稱@’主機範圍’; //撤銷欄位級
revoke 許可權 on 庫名.表名 from 使用者名稱@’主機範圍’; //撤銷表級
revoke 許可權 on 庫名.* from 使用者名稱@’主機範圍’; //撤銷庫級
revoke all privileges,grant option from 使用者名稱@’主機範圍’; //撤銷全域性級
revoke all privileges,grant option from 使用者1[,使用者名稱2,…]; //撤銷全域性級

檢視,建立,修改,刪除資料庫
select user(); //檢視當前的使用者
select database(); //檢視當前庫
select * from 資料庫名.表名; //檢視某個表
desc 表名; //描述,查看錶
show create table 表名; // 檢視建立表的總過程
drop table 表名; //刪除表
dropdatabase 庫名; //刪除庫
delete from 表名; //刪除所有的表記錄
truncate table 表名; //清空表
select count(*) from 表名; //檢視資料庫的資料量
show table status like ‘%表名%’ \G; //查看錶的建立時間,也可以沒有百分號。
delete table 表名 where 欄位名 = 記錄(值) or 欄位名 = 記錄 ;//刪除指定的欄位。
delete truncate 區別
delete可以加 where 條件,刪除單條或多條記錄,如果不加,就是清空所有表內容
truncate不可以加where條件,只能清空表

修改表名的兩種方法:
1)alter table 原表名 rename 新表名;
2)rename table 原表名 to 新表名;

建立資料庫的三種方法:
1)create database 資料庫名;
2)mysqladmin create 資料庫名 -uroot -p密碼;
3)在資料庫外的命令列操作:
# cd /var/lib/mysql/
# mkdir 資料庫名
# chown mysql:mysql 資料庫名
# chmod 700 資料庫名
刪除資料庫三種模式:
1)drop database 資料庫名;
2)mysqladmin drop 數庫名 -u root -p密碼
3)在資料庫外的命令列操作
# cd /var/lib/mysql
# rm -rf 資料庫名

建立表
create table 表名(id int(10) iPhone varchar(12) name varchar(10)); //建立表,括號裡的是欄位和資料型別。
1)insert into 表名(id,iphone,name) values(1 ,’17602285787’,’lzq’); //在表裡插入內容,values裡是新增的內容,一定要按順序新增。
2)insert into 表名 set id=18,iphone=’17602285787’,name=’lzq’; //第二種新增表內容的方

alter table 表名 add 欄位名 資料型別; //新增欄位
alter table 表名 change 原欄位名 新欄位名 資料型別; //修改欄位名
alter table 表名 change 原欄位名 新欄位名 資料型別; //修改欄位名和欄位型別
alter table 表名 modify 欄位名 資料型別; // 修改欄位型別
alter table 表名 drop 欄位名; //刪除欄位名
alter table 表名 add 欄位名 資料型別 first; //新增新欄位為第一個位置
alter table 表名 add 欄位名 資料型別 after 欄位名;//after意思是在誰的後面。
alter table 表名 modify 欄位名 型別 first; //指定欄位在第一的位置。
建立一個空的表,不能傳值。
alter table 表名 modify 欄位名 型別 null; //讓null記錄值為yes
alter table 表名 modify 欄位名 型別 not null;//讓NULL記錄值不為YES(空),而為NO。

資料複製,備份,恢復:
show create table 表名;//查看錶的建立語句。

複製記錄:
insert into 當前表 (欄位1,欄位2) select 要複製的欄位名 from 要複製的表名; //複製表的內容。
例項:首先表的結構必須是一樣的,要不然會報錯,資料插入不進去。
insert into t3 (name,id) select lower(name),password(lower(name)) from t2; //t3是新建的表,t2是有內容的表,在t2中往t3表中匯入資料。

create table 表名(select 欄位名 from 表名); //建立並複製表的結構和內容,select 欄位名 from 表名是要複製的表。
insert into t1 select * from t2; //把t2表的所有內容複製到t1裡

複製單個欄位記錄:
先建立一個lili表,在lili表中插入內容,在建立一個toto表,用下面的程式碼課以複製內容,
insert into toto (id,name) select lower(id),lower(name) from lili;
lower:是不區分大小寫函式。
建立表tt:
create table tt (id int(11),name char(10),sex char(‘M’,’F’));
insert into tt(id,name,sex) values (1,’ppp’,’M’);
建立表tp:
create table tp(id int(11),name char(10),sex char(‘M’,’F’));
從tt複製記錄到tp:
insert into tp (id,name) select lower(id),password(lower(name)) from tt;
password: 是加密函式。

表的備份,恢復
create table 新表(select * from 被複製表); //複製整個表內容
表結構複製
create table 新表(select * from 被複製表 where 5=3); //5=3是自定義的,隨便寫任何內容,5=3條件不成立複製表結構,1=1條件成立則複製表結構加資料。
複製表中指定欄位
create table 新表(select 欄位 from 被複製表); //只複製一個欄位的內容。
備份表
mysqldump -u使用者名稱 -p密碼 資料庫名 表名 > 資料庫.表.spl // 名子是自義定的,好區分就行。
mysqldump -u root -p密碼 資料庫名 表1 表2… > /資料庫.表.bak //備份多表。
例項:
mysqldump -u root -p db2 t7 > mysql17-12-19.sql //把db2庫裡的t7表備份出來,沒有預設的儲存位置需要手動新增路徑。
恢復表
mysql -u 使用者名稱 -p 密碼 -D 資料庫名 < /表文件 //可以不加引數-D,恢復資料的時候不需要新增表名。
例項:恢復表的流程
mysql -u root -p密碼 #進入資料庫
use db2; #進入db2資料庫
drop table t7,t8,t9; #刪除t7,t8,t9的表
exit #退出資料庫
mysql -u 使用者名稱 -p密碼 -D db2 < /db2.t7.t8.t9.bak //恢復表的命令。
在命令列裡操作匯出整個資料庫結構(不包含資料)
mysqldump -h 遠端主機IP -u 使用者名稱 -p 密碼 -d 資料庫名 > 資料庫名.sql
例項:
mysqldump -h localhost -uroot -p123456 -d database table > dump.sql
匯出單個數據表結構(不包含資料)
mysqldump -h 遠端主機ip -u使用者名稱 -p密碼 -d 資料庫名 表名 > 資料庫名.表名.sql
例項:
mysqldump -h localhost -uroot -p123456 -d database table > dump.sql
匯出整個資料庫資料
mysqldump -h 遠端主機ip -u使用者名稱 -p密碼 -t 資料庫名 > 資料庫.sql
例項:
mysqldump -h localhost -u使用者名稱 -p密碼 -t 庫名 > dump.sql
匯出結構+資料
mysqldump -h localhost -u使用者名稱 -p密碼 庫名 > dump.sql
匯出單個數據表結構和資料
mysqldump -h localhost -u使用者名稱 -p密碼庫名 表名 > dump.sql
備份指定庫
mysqldump -u root -p密碼 -B 資料庫名 > /資料庫.sql //-B引數可以不加。
例項:
mysqldump -u root -p密碼 -B db2 > /db2.sql
恢復指定庫
create database 資料庫名; //必須建立資料庫名,如果有就覆蓋
mysql -u root -p密碼 -B 資料庫名 < /資料庫.bak
備份所有庫,包括資料庫的系統庫
mysqldump -u root -p密碼 -A > /資料庫.bak
恢復所有庫
mysql -u root -p密碼 -A < /資料庫.bak
mysql -u root -p密碼 < /資料庫.bak

日誌恢復誤刪除的庫或者表
在配置檔案中新增選項:
vim /etc/my.conf
[mysqld] //在[mysqld] 行下新增
log-bin = mysql-binlong //新增的一行
重啟MySQL服務
檢視日誌:–no-defaults (外部命令)
mysqlbinlog –no-defaults mysql-bin.00001 //mysql-bin.00001是系統生成的日誌名字。
MySQL日誌檔案的位置: /usr/local/mysql/date

start-position //開始位置點
stop-position //結束位置點
mysqlbinlog –no-defaults –start-position=點位 –stop-position=點位 資料庫日誌名 (mybin.000001) | mysql -u使用者名稱 -p密碼 //通過位置點恢復刪除的資料庫

–start-datetime //時間開始點
–stop-datetime //時間結束點
mysqlbinlog –no-defaults –start-datetime=點位 –stop-datetime=點位 資料庫日誌名 (mybin.000001) | mysql -u使用者名稱 -p密碼 //通過位置點恢復刪除的資料庫
時間格式: 17-12-19 11:22:00 命令列固定格式。

檢視正在使用的binlog日誌檔案:
show master status; //檢視主
show slave status; //檢視從
檢視binlog的日誌目錄:
show variables like ‘datadir’;
檢視有哪些binlog檔案:
show master logs; //主日誌檔案
show binary logs; //二進位制日誌檔案
手動清理排除正在使用的二進位制檔案:
purge binary logs to ‘mysql-tb-bin.000005’; //清除 ‘mysql-tb-bin.000005’ 以外的其他二進位制檔案。 ‘mysql-tb-bin.000005’是之日檔案的名字。
purge master logs to ‘mysql-bin.000020’; //清除’mysql-bin.000020’此檔案之上的所有檔案。’mysql-bin.000020’是日誌檔案的名字。
自動清理二進位制檔案:
vim /etc/my.cnf // 在my.cnf裡面加上這個配置
[mysqld] //在這行下面新增條件
expire_logs_days=5 //定期5天清理一次日誌檔案。

往資料庫裡匯入資料:
先建立一個數據庫表,格式要與要匯入資料的分割的格式相符合才行。
1)create table tsm(one varchar(255),two varchar(255),three varchar(255),four varchar(255),five varchar(255),six varchar(255),sevev varchar(255)); //建立的資料庫表並設定了符合的格式。
2)load data infile ‘/a.txt’ into table 表名 fields terminated by ‘,’ lines terminated by ‘\n’; //匯入資料。 ‘/a.txt’ 是檔案絕對路徑。 ‘,’ 是分隔符。 ‘\n’ 是自動換行。

特別注意: –single-transaction 引數
1.所有備份操作,都會進行隱式鎖表,其預設引數為 –lock-all-tables , 備份完成後會自動unlock tables;
2.–single-transaction 引數備份時不鎖表 , 與–lock-all-tables & –lock-tables相沖突,不能同時使用,所以呼叫以下引數會自動關閉這兩個引數
3.–single-transaction 因為它不需要鎖表 , 主要功能是保持資料的一致性 , 它呼叫了事物 , 因為事物有4個特性(原子性,一致性,隔離性,永續性) , 所以只對innodb有效
mysqldump -uroot -pmysql 庫名 –single-transaction > 庫名.sql
//這裡只是簡單語法,上面的所有備份操作都可以加此引數

開啟MySQL慢查詢
記錄查詢時間長的語句就是慢查詢,
查詢一條資料時間在30秒以內為正常的sql語句。
查詢慢的原因:
1)網路的問題
2)語句的問題
3)異地,沒有CDN快取伺服器。
解決查詢慢的辦法:
1)找開發優化sql語句。
2)自己加索引優化,索引功能是加快查詢速度。
在配置檔案中新增慢查詢
vim /etc/my.cnf
[mysqld] //在此行下新增
slow_query_log = 1 //開啟慢查詢
slow_query_log_file = /usr/local/mysql/data/slow_query.log //慢查詢記錄的檔案
long_query_time = 1 //預設慢查詢的時間為1秒
log_queries_not_using_indexes = 1 //記錄未使用索引的查詢

show variables like ‘%slow%’; //檢視MySQL慢查詢是否開啟 , OFF是關閉狀態,ON是開啟狀態。

show global status like ‘%slow%’; //檢視慢查詢是否開啟

set global slow_query_log=ON; //開啟MySQL慢查詢功能,ON是開啟狀態。

show variables like “long_query_time”; //檢視MySQL慢查詢時間設定,預設10秒
set global long_query_time=5; //修改為記錄5秒內的查詢
select sleep(6); #測試MySQL慢查詢

show variables like ‘log_%’; //檢視是否開啟log日誌。
OFF是關閉的狀態。ON是開啟的狀態。

第三方 xtrabackup 增量備份工具
xtrabackup 是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫),是商業備份工具MySQL Enterprise Backup(meb)的一個很好的替代品。
xtrabackup 有兩個主要的工具:innobackupex和xtrabackup,xtrabackup只能備份InnoDB和XtraDB資料表,innobackupex封裝了xtrabackup,可以備份MyISAM資料表。
rpm-安裝
1)yum -y install perl-DBD-MySQL.x86_64 perl-Time-HiRes.x86_64
2)rpm -qa | grep perl-DBD
3)rpm -e –nodeps (rpm -qa | grep perl-DBD找出來的結果) //強制刪除
4)yum -y install perl-DBD-MySQL.x86_64
5)wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.3/binary/redhat/6/x86_64/percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm
6)rpm -ivh percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm
7)mkdir /var/lib/mysql
8)ln -s /tmp/mysql.sock /var/lib/mysql
測試:
innobackupex –user=root –password=mysql –database=test /tmp

centos7安裝xtrabackup
• 設定yum倉庫
1) wget https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-4.noarch.rpm
2) rpm -ivh percona-release-0.1-4.noarch.rpm
3)yum list | grep percona-xt //檢視yum裡percona-xt列表,可以省略不檢視。
• Install the package(yum安裝)
4)yum install percona-xtrabackup-24 -y
編譯安裝資料庫 測試命令
注意:/etc/my.cnf 配置檔案的socket的位置 是yum安裝(/var/lib/mysql/mysql.sock)還是編譯安裝(/tmp/mysql.sock 自己定義安裝的位置),
編譯安裝建立一個連線檔案
5)mkdir -p /var/lib/mysql
6)ln -s /tmp/mysql.sock /var/lib/mysql/
測試:
innobackupex –user=root –password=mysql –database=test /tmp

索引
所有MySQL列型別可以被索引。根據儲存引擎定義每個表的最大索引數和最大索引長度。
所有儲存引擎支援每個表至少16個索引,總索引長度至少為256位元組。大多數儲存引擎有更高的限制。
索引的儲存型別目前只有兩種:
1)btree (平衡二叉樹)
2)hash (雜湊演算法)
索引的型別:
1)normal : 普通索引 //是最基本的索引,它沒有任何的限制。
2)unique:唯一索引 //欄位值必須唯一。
3)fulltext:全文索引
檢視索引:
show index from 表名\G;
show keys from 表名\G;
刪除索引:
drop index 索引名 on 表名;
檢視索引使用情況:
show status like ‘Handler_read%’;
建立普通索引:
create index 索引名 on 表名 (欄位名(長度)); //單列索引
create index 索引名 on 表名(欄位名(長度),欄位名(長度),…); //組合索引
通過修改表結構來建立普通索引:
alter table 表名 add index 索引名(欄位名(長度)); //單列索引
alter table 表名 add index 索引名(欄位名(長度),欄位名(長度)); //組合索引
建立資料庫表的時候直接指定普通索引:
create table 表名(欄位名 型別,欄位名 型別,…..index 索引名(欄位名(長度))); //單列索引
create table 表名(欄位名 型別,欄位名 型別,……index 索引名(欄位名(長度),欄位名(長度)…)); //組合索引
唯一索引:
它與普通索引類似,不同的是:普通索引列的值必須唯一,但允許有空值。如是組合索引,則列值的組合必須唯一。
建立唯一索引:
create uniqe index 索引名 on 表名(欄位名(長度)); //單列索引
create uniqe index 索引夢 on 表名(欄位名(長度),欄位名(長度)…); //組合索引
通過修改表結構來建立唯一索引:
alter table 表名 add unqiue index 索引名(欄位名(長度)); //單列索引
alter table 表名 add unqiue index 索引名(欄位名(長度),欄位名(長度)…); //組合索引
建立表的時候直接建立唯一索引:
create table 表名(欄位名 型別,欄位名 型別,…,unique index 索引名(欄位名(長度))); //單列索引
create table 表名(欄位名 型別,欄位名 型別,…,unqiue index 索引名(欄位名(長度),欄位名(長度)….)); //組合索引
主鍵索引:
不允許有空值的索引。
修改表結構建立主鍵索引:
alter table 表名 primary key(欄位名); //單列索引
alter table 表名 primary key(欄位名,欄位名); //組合索引
建立表的時候這屆建立主鍵索引:
create table 表名(欄位名 型別,欄位名 型別,… primary key(欄位名));
create table 表名(欄位名 型別,欄位名 型別,… primary key(欄位名,欄位名,…)); //組合索引

主從&主主
原理:主從是基於binlog日誌。
主寫從讀,原因是寫少,讀多。
ip,埠號,資料庫的名,密碼,許可權。
阿里開發的drds可以配置讀寫分離,分庫分表,收費的。
主從架構圖
配置主從服務端
vim /etc/hosts //配置域名解析
192.168.33.128 www.lzq.com master
192.168.33.129 www.qiang.com slave

vim /etc/my.cof //配置MySQL的主檔案
[mysqld] // 在此行下面加入程式碼
server-id = 128 //id一般與主機IP的最後地址來定義,這樣容易記憶
log-bin = mysql-bin //建立binlog日誌,這就是讓主從同步的關鍵日誌
binlog_format = mixed //磁碟與語句變化自動識別轉換
重啟服務
//grant replication slave on . to ‘使用者名稱’@’主機’ identified by ‘密碼’; 我們用了 “slave” 做使用者名稱,給從用,密碼是 “123”
grant replication slave,reload,super on . to ‘slave’@’%’ identified by ‘123’;

flush privileges; //提交更新檔案
show master status \G; //檢視正在使用的binlog日誌的位置點
注意:
1.上面操作之後不要做任何操作
2.當然也可以在上面操作之後鎖表: flush tables with read lock; 就是隻讀,但不可以在寫入資料,可還要解鎖: unlock tables;

客戶端
vim /etc/hosts //配置域名解析
192.168.33.128 www.lzq.com master
192.168.33.129 www.qiang.com slave

vim /etc/my.cof //配置MySQL的主檔案
[mysqld] // 在此行下面加入程式碼
server-id = 128 //id一般與主機IP的最後地址來定義,這樣容易記憶
log-bin = mysql-bin //建立binlog日誌,這就是讓主從同步的關鍵日誌
binlog_format = mixed //磁碟與語句變化自動識別轉換
重啟服務
mysql -h 192.168.33.128 -u slave -p123 //測試一下能否連線master主機,配置成功就能順利登陸
show master status; //檢視正在使用的binlog日誌的位置點
mysql -u root -pmysql //登陸mysql
stop slave; //停止自動從主伺服器同步資料
// 對主伺服器master進行檢查同步, 上面的要與master相對應上,否則不會成功,後面的mysql-bin.000004與120就是主伺服器我不讓你操作的原因。
change master to master_host=’192.168.72.128’,master_user=’slave’,master_password=’123’,master_log_file=’mysql-bin.000004’,master_log_pos=120;
start slave; //啟動自動從主伺服器同步資料
show slave status\G //檢視是否成功同步
上面是報錯了,正常是兩個YES
解決辦法:進去資料庫在看一次就變成兩個YES
cd /usr/local/mysql/data //進入目錄
rm -rf mysql-bin* auto.cnf //刪除檔案
重啟服務
show slave status\G //檢視同步
測試: 進入主資料庫建立庫&表,就會發現從也會同步資料。
配置主主客戶端
進入從資料庫輸入下面的程式碼:
grant replication slave,reload,super on . to ‘master’@’%’ identified by ‘123’;
之前已經建了slave使用者了,所以現在我們建一個master使用者給以前的主用,這個使用者名稱可以隨意定義
flush privileges; //更新檔案
服務端
mysql -h 192.168.33.129 -u master -p123 //檢視一下是否能正常登入slave使用者,並退出
mysql -uroot -pmysql //登入資料庫
stop slave; //停止自動從主伺服器同步資料
change master to master_host=’192.168.72.130’,master_user=’master’,master_password=’123’,master_log_file=’mysql-bin.000004’,master_log_pos=414;
start slave; //啟動自動從主伺服器同步資料
show slave status\G //檢視是否成功同步
測試: 在資料庫建立庫&表,檢視是否同步

切換主從,主故障切換
客戶端操作:
mysql -uroot -pmysql
stop slave;
reset master;
show master status \G;
grant all on . to ‘rep1’@’192.168.33.128’ identified by ‘rep1’; //此賬號給從前的master用,讓它變為從
flush privileges;
flush tables with read lock;
在服務端上登入:
mysql -h 192.168.33.129 -urep1 -prep1 //測試一下能否連線現在的master主機

mysql -uroot -pmysql
stop slave;
change master to master_host=’192.168.72.130’,master_user=’rep1’,master_password=’rep1’,master_log_file=’mysql-bin.000001’,master_log_pos=120;
start slave;
show slave status \G;
客戶端
unlock tables; //現在從是主了