( 靜靜 )
DBA 數據庫管理員
IDC監控
mysql數據庫管理 7
Linux安全 3
Linux監控 3
————————————————————————————————————————
在mysql中 我創建一個student庫 並 設置字符集:utf8 -- UTF-8 Unicode,排序規則:utf8_general_ci
語句怎樣的
mysql> create database if not exists student default charset utf8 collate utf8_general_ci;
導入sql腳本 自動創建所需的表。
mysql> use cbas_orige
Database changed
mysql> source /root/dbtables.sql;
————————————————————————————————————————
create table t1(name char(10),pawword int(10),shel char(30))charset=utf8;
如果導入的是中文在 創表創庫時加上 utf8
(不管什麼數據如果要想導入到數據庫中,一定要在安裝數據庫本機中導入,給別的用戶授任何權限都只有增刪該查,不能執行導入這命令)
mysql>load data infile "/etc/passwd" into table userdb.student fields terminated by ":" lines terminated by "\n";
ftp://172.40.50.117/soft 軟件
++++++++++++++++++++++++
mysql數據庫管理 7
零基礎入門
表管理
用戶授權與權限撤銷
數據備份與數據恢復
mysql主從同步
mysql讀寫分離
mysql集羣
mysql優化
一、零基礎入門
1. 什麼是數據庫 存儲數據庫的倉庫
2 提供數據庫服務的軟件有哪些?
Oracle(不開源跨平臺) DB2(不開源跨平臺) SQL SERVER(不開源不跨平臺) MySQL(開源跨平臺)
商業軟件
開源軟件 不等於 免費
是否誇平臺 Unix Linux Windows
既開源又跨平臺 MySQL
MySQL發展史?
MySQL特點?
MariaDB ( RHEL7 )
數據遷移 mysql - > MariaDB
關係型數據庫系統
非關係型數據庫系統 Mongodb
用戶名 密碼
商品信息
名 型號 價格 總量
大衣 M 1800 3
銷售信息
名 型號 價格 個數
大衣 M 1800 2
工作中都哪些公司在使用數據庫服務
遊戲網站 購物網站 論壇網站
婚戀網站 金融網站
數據庫服務器用來儲存什麼數據?
登錄賬戶 購買的商品 發的帖子
提供網站服務 apache Nginx Tomcat
應用環境 : LAMP LNMP
搭建數據庫服務器(HP Dell 聯想 大概市場價位 性能)
CPU 內存 存儲
在IP地址是 x.x.x.x 運行MySQL數據庫服務
軟件包的來源?
官網下載 (一般奇數測試 偶數正式版)
操作系統安裝光盤自帶的
軟件包的封包 類型? .rpm
源碼 .tar.gz .tar.bz2
裝包 (.rpm)
安裝操作系統安裝光盤自帶的mysql軟件提供
數據庫服務
rpm -q mysql-server || yum -y install
mysql-server
service mysqld status|start|stop
chkconfig mysqld on
客戶端的訪問(默認只允許本機訪問)
[root@stu yum.repos.d]# which mysql
/usr/bin/mysql
[root@stu yum.repos.d]# rpm -qf
/usr/bin/mysql
mysql-5.1.73-5.el6_6.x86_64
[root@stu yum.repos.d]#
[root@stu ~]# mysql
mysql> quit
[root@stu ~]#
安裝官網下載的mysql軟件提供數據庫服務
/etc/init.d/mysqld stop
rpm -e --nodeps mysql-server mysql
rpm -q mysql-server mysql
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql/*
tar -xvf MySQL-5.6.rpm.tar
rpm -Uvh MySQL-*.rpm
service mysql start
213 cat /root/.mysql_secret
214mysql -hlocalhost -uroot -pCxifrkkA
mysql>set password for root@"localhost"=password("123");
mysql>quit;
mysql -hlocalhost -uroot -p123
mysql>show databases;
主配置文件 /etc/my.cnf
服務名 mysqld
進程名 mysqld
進程所有者/組 mysql/mysql
端口號 3306
傳輸協議 tcp
數據庫目錄 /var/lib/mysql/
把數據存儲到數據庫服務器上的過程?
1 連接數據庫服務器 mysql
2 選擇庫 use 庫名;
3 創建表
4 向表中插入記錄 insert into
5 斷開連接 quit
*數據以文件的形式存儲在數據庫目錄下
數據庫服務的基本使用?
SQL命令使用規則: 命令不區分字母大小寫
\c 終止命令
命令必須以;結尾
命令不支持tab鍵補齊
庫名的命名規則: 具有唯一性
區分字母大小寫
只能使用數字、字母 _
不能是純數字
不要使用特殊字符和關鍵字
? * .
show databases; 顯示已有的庫
create database 庫名;
use 庫名; 切換庫
select database(); 查看當前所在的庫
drop database 庫名; 刪除已有的庫
show tables; 顯示當前所在庫下已有的表
創建表(表存放在庫裏)
create table 庫名.表名(
字段名1 類型,
字段名2 類型,
字段名3 類型
);
create table bbsdb.stuinfo(
name char(10),
age int,
sex char(10)
);
select 字段名列表 from 表名; 查看錶記錄
select * from stuinfo;
desc 表名; 查看錶結構
desc stuinfo;
desc mysql.db;
select user,host,db from mysql.db;
向表中插入記錄
insert into stuinfo values("jim",21,"boy");
刪除表中的所有記錄
delete from 表名;
delete from stuinfo;
刪除表
drop table 表名;
drop table stuinfo;
建表的語法格式
create table 表名(
字段名 類型(寬度) 約束條件,
字段名 類型(寬度) 約束條件,
字段名 類型(寬度) 約束條件
);
++++++++++++++++++++++++++++++++++++
mysql數據庫類型
字符類型 (姓名 家庭地址)
char 定長 255
varchar 變長 255+
65532
大文本類型
blob
text
create table t1(
name char(5),
address varchar(20)
);
desc t1;
insert into db10.t1 values("jerryy","beijing");
insert into db10.t1 values("jerry","beijing");
select * from t1;
t1 t2
name name
char(3) varchar(3)
jim jim
a a
ab ab
abc abc
abcd abcd
create table t5( name text );
create table t5( name blob );
數值類型 (工資 成績 年齡 身高 體重)
18000.88 59.9 21
+21
-21
整數類型
根據存儲數值的範圍又分爲:
有符號 無符號
tinyint 微小整型 -128~127 0~255
smallint
MEDIUMINT
int
bigint
create table t7(level tinyint);
create table t8(age tinyint unsigned);
insert into t7 values(170);
insert into t7 values(-17);
insert into t7 values(128);
insert into t8 values(170);
insert into t8 values(-170);
insert into t8 values(17.54);
insert into t8 values(17.44);
select * from t8;
select * from t7;
浮點型 float double
單精度 雙精度
float(n,m)
double(n,m)
n 表示總位數
m 表小數位位數
整數.小數
1023.77
create table t9(
name char(10),
age int,
pay float(7,2)
);
insert into t9 values ("jim",21,118000.23);
insert into t9 values ("jim",21,118000);
數值類型的寬度與字符類型寬度的區別?
數值類型的寬度是顯示寬度,不能夠控制給字段賦值的大小,字段值的大小由字段類型決定。
create table t10(
name char(3),
id int(2)
);
insert into t10 values("lucy",1129);
insert into t10 values("tom",1129);
insert into t10 values("luc",1029);
create table t12(
level int(7) zerofill,
id int(3) zerofill
);
create table t13(
level int (1)
id int(1)
);
日期時間類型 (生日 註冊時間 入職時間)
年 year YYYY 2016
01-69 20XX
70-99 19XX
00 0000
日期 date YYYYMMDD 20161219
時間 time HHMMSS 144518
日期時間 ( 約會時間 )
datetime / timestamp
YYYYMMDDHHMMSS
20170214183018
datetime 與 timestamp 的區別?
當不給timestamp類型的字段賦值時,用系統當前的時間給字段賦值。
create table t16(
time1 timestamp,
time2 datetime
);
insert into t16 values(20171219165200,20161219165200);
insert into t16 (time1) values(20191219165200);
insert into t16 (time2) values(20151219165200);
create table t15(
name char(10),
age tinyint(2) unsigned,
pay float(7,2),
up_class time,
birthday date,
s_year year,
meetting datetime
);
insert into t15 values("bob",21,18800.88,083000,20170101,1995,20170224203000);
insert into t15(name,s_year)values("lucy",13);
insert into t15(name,s_year)values("alic",70),("lilei",00);
select name,s_year from t15;
使用時間函數獲取時間給日期時間類型字段賦值?
now() 獲取當前系統時間
year() 獲取年份
date() 獲取日期
month() 獲取月份
day() 獲取日期(幾號)
time() 獲取時間
select now();
select year( now() );
select year( 20191224 );
select date( now() );
insert into t15 values("lili",21,18800.88,093000,20171008,1995,now());
insert into t15 values("jerry",29,28800.88,now(),now(),now(),now());
insert into t15 values("tom",21,18800.88,time(20171224201818),date(20171224201818),year(now()),now());
枚舉類型 (愛好 性別 專業 )
字段的值只能在列舉的範圍內選擇
enum(值列表) 單選
set(值列表) 多選
create table t177(
name char(10),
sex enum(0,1),
likes set("book","game","film","music")
);
create table t17(
name char(10),
sex enum("boy","girl","no"),
likes set("book","game","film","music")
);
desc t17;
insert into t17 values("bob","boy","woman,game");
insert into t17 values("bob","boy","book,game");
insert into t17 values("alic",3,"game");
select * from t17;
查看建表過程
show create table 表名;
create table 學生信息表2(
姓名 char(10),
年齡 int(2)
)DEFAULT CHARSET=utf8;
insert into 學生信息表2 values ("張三丰",21);
課後作業:
創建stuinfo表,設置合理的字段個數和字段類型。
+++++++++++++++++++++++++++++++++++++++++++++++
day01內容回顧:
提供數據庫服務的軟件有哪些?
哪些是開源軟件 商業軟件 是否跨平臺?
mysql的發展史? 特點 ? 應用場景 分支版本
安裝系統自帶的mysql數據軟件提供服務?
rpm -q mysql-server mysql
啓動mysql數據庫服務
service mysqld start|stop|status
3306
/etc/my.cnf
mysqld
mysql/mysql
tcp
/var/lib/mysql/
連接數據庫服務器
mysql -hlocalhost -uroot -p123 庫名
SQL命令 的使用規則?
管理庫相關的命令?
show databases; (顯示有哪些數據庫)
use 庫名;(進入一個數據庫)
select database();(查看當前在哪一個庫)
show tables; (查看名下有哪些表)
create database 庫名;(創建一個數據庫)
drop database 庫名;(刪除一個數據庫)
管理表相關的命令?
create table 表(字段列表); mysql> create table t1(name int);創建一個表
select * from 表名; (查看錶中的內容)
desc 表名; ( 打開該表)
delete from 表名; (刪除表中的內容)
drop table 表名; (刪除該表)
insert into 表名 values(字段值列表);
mysql數據類型?
字符類型 char varchar text blob
數值類型 tinyint smallint int bigint
float(n,m)
double(n,m)
闡述zerofill 和 unsigned 作用?
日期時間類型 year data time datetime timestmap
使用2位數給year類型字段賦值的規律?
01-69 20xx
70-99 19xx
00 0000
時間函數 now() year() date() day() month() time()
枚舉類型 enum set
單選 多選
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
約束條件
作用:當向表中插入新記錄時,限制如何給字段賦值,若建表時不設置約束條件,使用mysql的默認設置。
Null 是否允許爲null (空) 不設置默認允許爲空
not null 不允許爲null
mysql> create table t18(
-> name char(10) not null,
-> age tinyint(2) unsigned default 23,
-> sex enum("boy","girl") default "boy",
-> likes set("it","book","work","film") default "it,book"
-> );
Query OK, 0 rows affected (0.67 sec)
create table t22(
name char(5) not null,
id int(2) not null
);
insert into t21 values(null,null);
insert into t22 values("",19);
insert into t22 values("NULL",19);
Key 是否是索引字段
默認不是索引字段
Default 字段是否有默認值,若沒有設置默認值,默認值是null
作用:向表中插入新記錄時,當不給記錄的字段賦值時,使用字段的默認值給字段賦值,指定默認值時 要與字段的類型匹配。
字段名 類型(寬度) default 值
create table t23(
name char(10) not null ,
age tinyint(2) unsigned default 21,
sex enum("boy","girl") not null default "boy",
likes set("book","music","film","game") default "film,game"
);
insert into t23(name)values("bob");
insert into t23 values("tom",28,"girl","book");
insert into t23 values(null,28,"girl","book");
insert into t23 values("null",28,"girl","book");
insert into t23 values("",28,"girl","book");
Extra 額外設置(例如自增長 描述信息)
+++++++++++++++++++++++++++++++++++++++++++++++
修改表結構
alter table 表名 執行動作;
add 添加新字段
add 字段名 類型(寬度);
add 字段名 類型(寬度) 約束條件 ;
add 字段名 類型(寬度) 約束條件 first;
add 字段名 類型(寬度) 約束條件 after 字段名;
alter table t1 add class char(7) default "nsd1609" first,add tel char(11) ,add sex enum ("boy","girl") default "boy" after name;
drop 刪除字段
drop 字段名
alter table t1 drop name,drop sex;
modify 修改字段類型
* 不能與字段已經存儲的數據衝突
modify 字段名 類型(寬度) 約束條件;
mysql> alter table t1
-> modify
-> sex enum("boy","girl","no") not null default "no";
change 修改字段名
change 原字段名 新字段名 類型(寬度) 約束條件;
alter table t1 change tel iphone char(11);
修改表名
alter table 原表名 rename [to] 新表名;
alter table t1 rename t111;
+++++++++++++++++++++++++
day02
一、mysql索引
二、mysql存儲引擎
一、mysql索引
什麼是索引? 相當於 "書的目錄"
總頁數 1000頁
1~1000
目錄 1----30
第一章 31--217 網站搭建
35-40 數據加密 2
第2章 218--273 dhcp
。。。
第十章
正文
索引的優點 加快查詢記錄的速度.
索引的缺點 會減慢寫的速度( insert update delete ).
佔用物理存儲空間.
在表裏建索引 設置在字段上
stuinfo.frm stuinfo.ibd
name class sex age
jim
tom
lucy
jerry
bob
alic
aliccc
select name from userinfo where name like "j%";
mysql索引類型?
普通索引 index *
唯一索引 unique
主鍵 primary key *
外鍵 foreign key *
全文索引 fulltext
使用索引(查看 創建 使用規則 刪除 )?
查看索引?
desc 表名;key
show index from 表名\G;
Table: user
Column_name: Host
Key_name: PRIMARY
Index_type: BTREE B+tree hash
二叉樹
1-10
1-5 6-10
1-2.5 2.6-5
++++++++++++++++++++++
index普通索引的使用規則?
一個表中可以有多個INDEX字段
字段的值允許有重複,且可以賦NULL值
經常把做查詢條件的字段設置爲INDEX字段
INDEX字段的KEY標誌是MUL
創建普通索引?
1 在已有表裏創建index字段
create index 索引名 on 表名(字段名);
create index sex on t111(sex);
2 建表時創建index字段
create table 表名 (
字段名列表,
index(字段名),
index(字段名)
);
create table t24(
name char(10) ,
age tinyint(2) unsigned default 21,
sex enum("boy","girl") default "boy",
likes set("book","music","film","game") default "film,game",
index(name),
index(sex)
);
insert into t24(name)values("bob"),("bob"),(null),(null);
刪除普通索引?
drop index 索引名 on 表名;
drop index sex on t24;
++++++++++++++++++++++++++++++++++++++++++++++
primary key 主鍵的使用規則?
一個表中只能有一個primary key字段
對應的字段值不允許有重複,且不允許賦NULL值
如果有多個字段都作爲PRIMARY KEY,稱爲複合主鍵,必須一起創建。
主鍵字段的KEY標誌是PRI
通常與 AUTO_INCREMENT 連用
經常把表中能夠唯一標識記錄的字段設置爲主鍵字段[記錄編號字段]
建表時創建主鍵字段
create table t25(
name char(10),
age int(2),
primary key(name)
);
create table t26(
name char(10) primary key,
age int(2)
);
刪除主鍵
alter table 表名 drop primary key;
在已有表裏創建主鍵
alter table 表名 add primary key(字段名);
複合主鍵的使用? 多個字段一起做主鍵是複合主鍵 必須一起創建。
*字段的值不允許同時相同。
create table t29(
host char(10),
db char(10),
user char(10),
primary key(host,db,user)
);
alter table t29 drop primary key;
alter table t29 add primary key(host,user,db);
insert into t29 values("2.1.1.1","game","tom");
insert into t29 values("2.1.1.1","bbsdb","tom");
insert into t29 values("2.1.1.1","game","jim");
通常和aUTO_INCREMENT 連用 實現字段值的字段增長
數值類型
主鍵
id name age
1 jim 21
2 jim 21
3 jim 21
create table t221(
id int(2) primary key auto_increment,
name char(10),
age int(2)
);
insert into t221(name,age)values("jim",21);
insert into t221(name,age)values("tom",19);
select * from t221;
insert into t221(id,name,age)values(7,"bob",19);
select * from t221;
經常把表中能夠唯一標識記錄的字段設置爲主鍵字段[記錄編號字段]
+++++++++++++++++++++++++++++++++++++++++++++
唯一索引 unique ?
字段的值可以爲Null 但不可以重複
一個表裏可以有多個unique字段
標誌 UNI
姓名 身份證 考試證 護照 駕駛證
jim null
tom null
建表時創建
create table t29(
name char(10),
stu_id char(9),
age int(2),
unique(stu_id)
);
mysql> insert into t29 values ("lucy","nsd160903",18);
Query OK, 1 row affected (0.05 sec)
mysql> insert into t29 values ("lucy","nsd160901",18);
mysql> insert into t29 values ("lucy","nsd160903",18);
mysql> insert into t29 values ("lucy",null,18);
drop index 索引名 on 表名;
drop index stu_id on t29;
在已有表裏創建unique字段
create unique index 索引名 on 表名(字段名);
create unique index stu_id on t29(stu_id);
++++++++++++++++
繳費表
jfb_id name pay
98 jim 20000
87 bob 18000
92 alic 20000
班級表
bjb_id name
98 jim
87 bob
+++++++++++++++++++++++++++++++++++++++++++++++++
外鍵 foreign key *
功能 讓當前表某個字段的值,在另一個表某個字段值的範圍內選擇。
使用規則?
1 表的存儲引擎必須是innodb
2 字段的數據類型要匹配
3 被參考的字段必須是key 中的一種 (primary key)
create table jfb(
jfb_id int(2) primary key auto_increment,
name char(10),
pay float(7,2)
)engine=innodb;
insert into jfb(name,pay)values("bob",18000),("lucy",17800),("alic",20000);
create table bjb(
bjb_id int(2),
name char(10),
foreign key(bjb_id) references jfb(jfb_id) on update cascade on delete cascade
)engine=innodb;
mysql> show create table bjb;
select * from bjb;
insert into bjb values(2,"lucy");
insert into jfb(name,pay)values("lilei",18000);
insert into bjb values(5,"lilei");
update jfb set jfb_id=8 where jfb_id=2;
delete from jfb where jfb_id=3;
++++++++++++++++++++++++++++++++++++++++++++++++++++++
使用外鍵的注意事項?
delete from jfb;
alter table jfb drop jfb_id;
drop table jfb;
刪除外鍵
show create table 表名;
alter table 表名 drop foreign key 外鍵名;
alter table bjb drop foreign key bjb_ibfk_1;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
二、mysql存儲引擎
什麼是存儲引擎?
表的處理器,是mysql數據庫服務軟件自動程序,不同處理器有不同的功能和數據存儲方式。
查看數據庫服務支持哪些存儲引擎?
show engines;
InnoDB DEFAULT
修改mysql數據庫服務默認使用的存儲引擎?
vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
:wq
service mysql stop
service mysql start
建表時指定表使用的存儲引擎
create table t31(name char(10))engine=memory;
修改表使用的存儲引擎?
alter table 表名 engine=存儲引擎名;
alter table t31 engine=innodb;
查看錶使用的存儲引擎?
show create table 表名;
工作中使用哪種存儲引擎?
myisam
innodb
myisam的特點?
支持表級鎖
不支持外鍵 、 事務 、事務回滾
獨享表空間
t1.frm 表結構
t1.MYD 表記錄
t1.MYI 表索引
innodb的特點?
支持行級鎖
支持外鍵 、 事務 、事務回滾
共享表空間
t3.frm 表結構
t3.ibd 表記錄+表索引
事務? 一次sql操作從開始到結束的過程。
事務回滾?執行一次事務,只要執行過程中,任何一步執行失敗,就恢復之前所有的sql操作。
ATM
A ------------> B
A 登錄 密碼
轉賬 金額 10000
對方卡號 xxxxxx
確定
轉賬中...... A-1W B+1W
餘額不足
轉賬成功
退卡
事務日誌文件記錄對所有inondb存儲引擎的表執行過的sql命令。
ibdata1 記錄sql命令產生的數據信息
ib_logfile0----|
|---> 記錄SQL 命令
ib_logfile1----|
insert into t1 values(101),(202),(999);
ti.idb 真實的數據
select * from t1
id
101
202
999
鎖機制是爲了解決客戶端的併發訪問衝突問題。
鎖粒度: 表級鎖 行級鎖 頁級鎖
鎖類型:
讀鎖 (共享鎖) select * from t1;
寫鎖 (互斥鎖 排它鎖)
insert into t1 values(22);
update t1 set id=102 where id=22;
delete from t1 where id=99;
建表時如何決定表使用的存儲引擎?
執行寫操作多的表適合使用inondb存儲引擎,這樣併發訪問大。
執行讀操作多的表適合使用myisam存儲引擎.
mysql體系結構(mysql服務的工作過程)
連接池
sql接口
分析器
優化器
查詢緩存
存儲引擎
文件系統
管理工具
++++++++++++++++++++++++
day02內容回顧:
1約束條件:
是否允許爲空 not null
是否是索引
默認值 default 值
額外設置
2修改表結構:
alter table 表名 執行動作;
add after first
modify
drop
change
3mysql 索引
什麼是索引?
優點與缺點?
mysql索引類型
index primary key unique foreign key
索引的查看 創建 刪除 使用規則
4 mysql存儲引擎
修改mysql數據庫服務默認使用的存儲引擎
vim /etc/my.cnf
[mysqld]
default-storage-engine=存儲引擎名
:wq
service mysql restart
查看存儲引擎:
show engines;
show create table 表名;
create table 表名(字段列表)engine=存儲
引擎名;
alter table 表名 engine=存儲引擎名;
+++++++++++++++++++++++
day03
數據導入 : 把系統文件的內容存儲到數據庫的表裏。
語法格式:
mysql> LOAD DATA INFILE '文件名' INTO TABLE 表名
FIELDS TERMINATED BY '分隔符' LINES TERMINATED BY '\n';
把系統用戶信息存儲到數據庫服務器userdb庫下的student表裏。
cat /etc/passwd
用戶名 密碼 uid gid 描述信息 家目錄 shell
create database userdb;
create table userdb.student(
name char(25),
password char(1),
uid smallint(2),
gid smallint(2),
comment varchar(50),
homedir char(30),
shell char(30),
index(name)
);
(不管什麼數據如果要想導入到數據庫中,一定要在安裝數據庫本機中導入,給別的用戶授任何權限都只有增刪該查,不能執行導入這命令)
mysql>load data infile "/etc/passwd" into table userdb.student fields terminated by ":" lines terminated by "\n";
-----------------------
mysql> select * from student;
mysql>alter table userdb.student add id int(2) zerofill primary key auto_increment first;
數據導入注意事項:
字段分隔符要與文件內的一致
指定導入文件的絕對路徑
導入數據的表字段類型要與文件字段匹配
++++++++++++++++++++++++++++++++++++++
數據導出: 把表中的記錄存儲到系統文件裏。
語法格式:
sql查詢命令 INTO OUTFILE '文件名';
sql查詢命令 INTO OUTFILE '目錄名/文件名';
sql查詢命令 INTO OUTFILE '目錄名/文件名' fields terminated by "符號";
sql查詢命令 INTO OUTFILE '目錄名/文件名' lines terminated by "!!!";
sql查詢命令 INTO OUTFILE '目錄名/文件名' fields terminated by "符號" lines terminated by "符號";
mysql>select * from student into outfile "plj.txt";
mysql>select * from userdb.student into outfile "/tmp/plj8.txt";
#mkdir /mydata
#chown mysql /mydata
mysql>select * from userdb.student into outfile "/mydata/plj8.txt";
mysql>select name,uid,shell from userdb.student into outfile "/mydata/plj1.txt";
mysql>select name,uid,shell from userdb.student limit 4;
mysql>select name,uid,shell from userdb.student limit 4 into outfile "/mydata/plj3.txt" fields terminated by "##";
mysql>select name,uid,shell from userdb.student limit 4 into outfile "/mydata/plj7.txt" lines terminated by "!!!";
數據導出的注意事項:
導出的內容由SQL查詢語句決定
若不指定路徑,默認會放在執行導出命令時所在庫對應的數據庫目錄下。
應確保mysql用戶對目標文件夾有寫權限。
目標位置文件具有唯一性
++++++++++++++++++++++++++++++++++++++++++++++++++++
管理表記錄
插入新記錄 insert into
一次插入一條記錄 給記錄的所有字段賦值
insert into 庫.表 values(值列表);
一次插入多條記錄 給記錄的所有字段賦值
insert into 庫.表 values(值列表),(值列表);
一次插入1條記錄 給記錄的指定字段賦值
insert into 庫.表(字段名列表) values(值列表);
一次插入多條記錄 給記錄的指定字段賦值
insert into 庫.表(字段名列表) values(值列表),(值列表);
insert into userdb.student values
(26,"bob","x",2077,2077,"this is student","/home/bob","/sbin/nologin");
insert into userdb.student values(27,"bob","x",2077,2077,"this is student","/home/bob","/sbin/nologin"),(28,"bob","x",2077,2077,"this is student","/home/bob","/sbin/nologin");
insert into userdb.student(name,uid,gid) values("alic",300,301);
insert into userdb.student(name,uid,gid) values("alic",300,301),("lucy",309,401);
++++++++++++++++++++++++
查詢表記錄 select
select 字段列表 from 表名;
select 字段列表 from 表名 where 表達式;
select * from student;
select id,name,homedir from student;
select 字段列表 from 表名 where 條件表達式;
select * from student where id=3;
select id,name,homedir from student where id=3;
條件的表示方式?
1 數值比較
字段名 符號 數字
= != > >= < <=
select * from student where id=5;
select * from student where id<=10;
select name,shell from student where uid=500;
select * from student where uid=500;
2 字符比較
字段名 符號 "值"
= !=
select name from student where name="zhangsan";
select * from student where name!="root";
3 範圍內比較
between ... and ... 在...之間
in (值列表) 在....裏
not in (值列表) 不在....裏
select name,uid,homedir,shell from student where uid between 10 and 20;
select name from student where name in ("root","daemon","rsync");
select name,uid from student where uid in (2000,100,105,13);
select id,name,uid from student where id not in (1,10,20);
+++++++++++++++++++++++++++++++++++
4 匹配空 is null
匹配非空 is not null
insert into student(id,name)values(30,""),(31,null),(32,"null"),(33,NULL);
select id,name from student where name is null;
select id,name from student where name="null";
select id,name from student where name="";
select id,name from student where name is not null;
select id,name from student where shell is null;
select id,name from student where name like '%';(31不顯示出來)
+++++++++++++++++++++++++++++++++++++++++++++++
邏輯比較(多個查詢條件)
邏輯與 and 多個查詢條件必須同時成立
邏輯或 or 多個查詢條件某個條件成立就可以
邏輯非 ! 取反
and和or同時出現 默認先判斷and再判斷or, 或者在or判斷加小括號就先判斷or 再判斷and.
select id,uid,name,homedir,shell from student where name="root" or uid=1 or shell="/bin/bash";
select name,uid from student where name="root" or name="bin" and uid=0
select name,uid from student where name="root" or name="bin" and uid=1 ;
select name,uid from student where (name="root" or name="bin" ) and uid=1 ;
+++++++++++++++++++++++++++++++++++++++++++++++++
6 四則運算 + - * / %
alter table student add age tinyint(2) default 21 after name;
alter table student add linuxsys int(2) default 60 after age, add linuxser int(2) default 60 after linuxsys;
select name,2016-age as s_year , age from student;
select name,year(now())-age as s_year , age from student;
select name,age,linuxsys,linuxser,(linuxsys+linuxser)/2 as pjf from student where name="root";
select name,age,linuxsys,linuxser,(linuxsys+linuxser) as zcj from student where name="root";
++++++++++++++++++++++++++++++++++++++++++++++++
7 模糊查詢 like
where 字段名 like '表達式'
_ 任意一個字符
% 零個或多個字符
select name from student where name like '___';
insert into student(name)values("a");
select name from student where name like 'a%'; 這是a開頭的所有
select name from student where name like '_a_';
select name from student where name like '%a%'; 只要還有a的都要
select id,name from student where name like '%'; 所有的都出現
mysql> select name,uid from student where name like '_%_';兩個或多個
mysql> select name,uid from student where name regexp '....'; 出現名字是四個的或四個以上
mysql> select name,uid from student where name like '____'; 出現名字是四個的
+++++++++++++++++++++++++++++++++++++++++++++++
8 在查詢結果裏過慮數據 having 條件
select id,name from student where name like '%' having id in (33,31);
select name from student where uid <500 having name="jim";
select name from stuent where uid<500 and name="jim";
select name from t1 where class="nsd1610" having name="lilei";
+++++++++++++++++++++++++++++++++++++
9 使用正則表達式做查詢條件
^ $ . * [ ]
字段名 regexp '正則表達式'
insert into student(name)values("plj9"),("pl8j"),("p7lj"),("6plj"),("1plj");
mysql> select name,uid from student where name regexp '^[0-9]';
select name,uid from student where name regexp '^a.*t$';
select name,uid from student where name regexp '^a.*t$' and shell="/sbin/nologin";
select name,uid from student where uid regexp '^..$';兩位的
select name,uid from student where uid regexp '..';兩位以上的都出現
mysql> select name,uid from student where uid regexp '...';三位的以上的都出現
mysql> select name,uid from student where uid regexp '^...$';三位的出現
mysql> select name,uid from student where name regexp '...';名字包含三個或三個以上的都出現
查詢結果爲四位數的:三種方式
select name,uid from student where uid regexp '^....$'; ###
select name,uid from student where uid between 1000 and 9999;###
mysql> select name,uid from student where uid>1000;###
++++++++++++++++++++++++++++++++++++++++++++++++++++++
10 聚集函數:做數據統計的mysql服務自帶的內置命令
max(字段名) 獲取最大值
min(字段名) 獲取最小值
avg(字段名) 獲取平均值
sum(字段名) 求和
count(字段名) 獲取字段值個數
select avg(linuxsys) from student;
select sum(linuxsys) from student;
select max(gid),min(uid) from student;
select count(name),count(id) from student; (id=57 name=55 是因爲name有null)
select count(name) from student where shell is null;
select count(*) from student; 所有列個數
select count(id) from student; 所有列個數
mysql> select count(uid) from student where uid>=5 and uid<=10 ; (uid 大於5小於10的個數)
+++++++++++++++++++++++++++++++++++++
11 查詢分組 group by 字段名
sql查詢命令 group by 字段名;
select shell from student where uid<500 group by shell;
select 部門 from 員工信息表 where 性別="女" and 年齡<=25 and 工資>=10000 group by 部門;
12 查詢排序 order by
sql查詢命令 order by 字段名 排序方式
asc 升序(默認)
desc 降序
select uid from student where uid <500 order by uid;
select uid from student where uid <500 and shell!="/bin/bash" order by uid desc
++++++++++++++++++++++++++++++++++++++
13 limit 限制顯示查詢結果記錄的行數。
SQL查詢命令 limit 數字;
SQL查詢命令 limit 起始行,共顯示幾行
第1行的編號是0(零)
select * from student limit 1;
select * from student limit 3;
select * from student limit 2,5;
select name,uid from student order by uid;
select name,uid from student order by uid desc limit 5;
select name,uid from student order by uid desc limit 5,10;
select * from student where uid is not null order by uid;
mysql> select * from student where uid is not null order by uid limit 2; ####
+++++++++++++++++++
mysql> select name from student where name order by name; ###
按名字排序:
++++++++++++++++++++
mysql> select name from student where name is not null having name="root"; (having.....過濾 查找,前面結果找)
+------+
| name |
+------+
| root |
| root |
mysql> select name from student where name is not null and name="root"; (查找 全表找)
+------+
| name |
+------+
| root |
| root |
++++++++++++++++++++++++++++++++++++++++++++
14 DISTINCT 不顯示重複的值
select distinct shell from student; 每種出現一個
select shell from student group by shell;
select distinct shell from student where uid<500; (uid小於500的,每種出現一個)
++++++++++++++++++++++++++++++++
15 where 子查詢
把內層查詢結果做爲外層的查詢條件。
select 字段名列表 from 表名 條件 (select 字段名列表 from 表名);
insert into student(name,linuxsys)values("lili",38),("jerry",58),("lucy",59);
select avg(linuxsys) from student;
select name,linuxsys from student where linuxsys < (select avg(linuxsys) from student);
select id,name from student where name in (select userser from mysql.user where host="localhost");
mysql> select name from student
-> where
-> name in (select user from mysql.user where host="::1");
+------+
| name |
+------+
| root |
select lisi from 用戶表 where lisi in(select 姓名 from db1.家庭地址表 where 城市="上海 ");
查找單課成績小於這顆的平均分用戶
select name,linuxsys from student where linuxsys < (select avg(linuxsys) from student);
+++++++++++++++++++++++++++++++++++++++++++
16 複製表(備份表 快速創建新表)
create table 新表名 sql查詢命令;
複製全表(複製完後,新表不會繼承索引)
create table 新表名 select * from 表名;
create table stu4 select * from student;
複製部分數據
create table 新表名 select 字段名列表
from 表名 where 條件;
create table stu3 select name,homedir,shell from student where uid<=10 ;
mysql> create table student5 select name,uid from student where uid>=20 ;
只複製表結構 (讓後面的查找不成立爲空,在複製就是空表)
create table 新表名 select * from 表名 where 1 = 2;
create table stu2 select * from student where 1 = 2;
mysql> create table student3 select * from student where 1 = 3;
+++++++++++++++++++++++
17 更新表記錄update (修改記錄字段的值)
批量修改
update 表名 set 字段名=值,字段名="值";
update student set age=18;
mysql> update student set linuxsys=100;
mysql> update student set linuxsys=05 where name="root";
修改符合條件的記錄字段的值
update 表名 set 字段名=值,字段名="值" where 條件;
update student set name="zhangsan" where id=31;
update student set shell=null where id=31;
update student set shell="" where name="bin";
mysql> update student set linuxsys=null ;
mysql> update student set linuxsys=0 where name="root";
18 刪除表記錄 delete
刪除表的所有記錄。
delete from 表名;
只刪除符合條件的記錄
delete from 表名 where 條件;
delete from student where name is null;
delete from student where name="bob";
mysql> select * from student where name is null;
+----+------+------+----------+----------+----------+------+------+---------+---------+-------+
| id | name | age | linuxsys | linuxser | password | uid | gid | comment | homedir | shell |
+----+------+------+----------+----------+----------+------+------+---------+---------+-------+
| 53 | NULL | 21 | 100 | 70 | NULL | 1234 | NULL | NULL | NULL | NULL |
| 54 | NULL | 21 | 100 | 70 | NULL | 4565 | NULL | NULL | NULL | NULL |
+----+------+------+----------+----------+----------+------+------+---------+---------+-------+
2 rows in set (0.00 sec)
mysql> delete from student where name is null;
mysql> select * from student where name is null;
Empty set (0.00 sec)
19 多表查詢:
select 字段名列表 from 表名列表;(笛卡爾集)
select 字段名列表 from 表名列表 where 條件;
*只顯示與條件匹配記錄字段的值。
create table t41 select name,uid from student limit 2;
create table t42 select name,uid,shell from student limit 4;
select * from t41,t42 where t41.uid = t42.uid;
select t41.name,t42.* from t41,t42 where t41.uid = t42.uid;
select t41.name,t42.name from t41,t42 where t41.uid = t42.uid;
+++++++++++++++++++++++++++++++++++++++++++++++++++
連接查詢:
左連接查詢(查詢時以左邊的表爲主顯示查詢記錄)
select 字段名列表 from 表1 left join 表2 on 條件;
右連接查詢(查詢時以右邊的表爲主顯示查詢記錄,左表沒有的記錄用null與右表匹配)
select 字段名列表 from 表1 right join 表2 on 條件;
create table t43 select name,uid,shell from student limit 3;
create table t44 select name,uid,shell from student limit 5;
select * from t43 left join t44 on t43.uid = t44.uid;
select count( *) from t43 left join t44 on t43.uid = t44.uid;
select t43.name from t43 left join t44 on t43.uid = t44.uid;
select t43.* from t43 left join t44 on t43.uid = t44.uid;
select * from t43 right join t44 on t43.uid = t44.uid;
+++++++++++++++++++++++++
day03課程內容回顧:
數據導入
1 什麼是數據導入
2 導入命令的語法格式
3 導入數據注意事項
數據導出
1 什麼是數據導出
2 導出命令的語法格式
3 導出數據注意事項
管理表記錄:
插入記錄 insert into
查詢記錄 select
查詢條件: 數值比較 字符比較
範圍內查找
匹配空 匹配非空
邏輯比較
四則運算
模糊查詢 like _ %
正則匹配 regexp ^ $ . * [ ]
聚集函數 max() min() avg()
sum() count()
查詢排序
order by 字段名 desc/asc
查詢分組
group by 字段名;
限制顯示記錄數
limit 數字
limit 數字1,數字2
在查詢結果裏過濾數據
having 條件
where嵌套查詢
sql查詢 where 字段 符號 (sql查詢);
更新記錄字段值
update 表名 set 字段名=值,字段名="值";
update 表名 set 字段名=值,字段名="值" where 條件;
update student set name="" where name="jim";
update student set shell=null where name="root";
update student set shell=null where id<=10;
update student set homedir="" where id<=10;
刪除表記錄
delete from 表名;
delete from 表名 where 條件;
複製表(快速創建新表 備份表)
*不會把原表的字段的索引屬性複製給新表。
create table 新表名 sql查詢 ;
+++++++++++++++++++++++++++++++++++++++++++++++++++++
day04
恢復數據庫管理員從數據庫服務器本機登錄的密碼。
#service mysql stop
#service mysql start --skip-grant-tables
#mysql
mysql> update mysql.user
-> set
-> password=password("654321")
-> where
-> host="localhost" and user="root";
mysql> flush privileges;
mysql> quit;
#service mysql stop
#service mysql start
#mysql -uroot -p654321
mysql>
修改數據庫管理從本機登錄的密碼
[root@stu db100]#
mysqladmin -hlocalhost -uroot -p password "新密碼"
Enter password: 舊密碼
+++++++++++++++++++++++++++++++
用戶授權及撤銷
用戶授權的作用:在數據庫服務器上新添加一個連接數據庫服務器的用戶,並設置這個用連接到數據庫服務器後的訪問權限。
給誰授權? 使用者(網站服務器) -hip(ip是網站服務器主機ip) -u.. -p..
管理者(DAB)
* 默認只有數據庫管理員root用戶從服務器本機登錄纔有授權權限。
mysql> select user(); 查看當前登錄用戶
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
mysql> show grants; 查看當前用戶權限
____+_++++++++++++++++++++++++++++++++++++++++++++++++++
[root@19 ~]# mysql -uroot -p123456
mysql> grant all on *.* to jb@"localhost" identified by "123";
mysql> quit;
[root@19 ~]# mysql -ujb -p123
mysql> select user();
+--------------+
| user() |
+--------------+
| jb@localhost |
mysql> show grants;
+--------------------------------------------------------------------------------------------------------------------+
| Grants for jb@localhost |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'jb'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
+--------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++
授權的語法
mysql -hlocalhost -uroot -p999
mysql> grant 權限列表 on 數據庫名 to 用戶名@"客戶端地址" identified by "密碼" with grant option;
(客戶端地址,ip 密碼:登錄時密碼 它也有授權命令)
mysql> grant 權限列表 on 數據庫名 to 用戶名;
權限列表:
all 所有權限
select,update(name,age) 指定權限
usage 無權限
授權:
grant all on *.* to plj@"localhost" identified by "123456";
數據庫名:
*.* 所有庫和所有表
庫名.* 一個庫的權限
庫名.表名 一張表的權限
用戶名: 客戶端連接數據庫服務器時,使用的登陸名,授權時自定義即可,要有標識性。
客戶端地址: 可選項
% 所有地址
172.40.50.117 一個IP地址
192.168.1.% 一個網段
pc100.tedu.cn 主機名
%.tedu.cn 域名
identified by "密碼" 設置授權用戶連接時使用的密碼 可選項
with grant option 設置授權用戶連接後,有授權權限 可選項
select user(); 顯示登陸的用戶名和客戶端地址;
show grants; 登陸數據庫服務器的用戶查看自己的訪問權限
例子
允許數據庫管理員賬號可以從117主機連接自己,連接後對所有庫、表擁有完全權限,且有授權權限,連接的密碼是plj123
grant all on *.* to root@"172.40.50.117" identified by "plj123" with grant option;
117:
mysql -h172.40.50.171 -uroot -pplj123
mysql>grant all on bbsdb.* to student@"%" identified by "123";
mysql>grant select,insert on userdb.student to studen2;
mysql>grant select,update(name,uid) on userdb.student to student3;
讓jim用戶可以在數據庫本機登錄數據庫服務對庫表有完全權限 登陸密碼是123456
grant all on *.* to jim@"localhost" identified by "123456";
+++++++++++++++++
默認的4個數據庫:
information_schema 虛擬庫 +++存儲在內存 不佔用硬盤存儲空間(在/var/lib/mysql下沒有文件夾)+++
performance_schema 服務運行時的參數信息
mysql 授權庫
test 公共庫 只要用戶能夠連接到服務上對此庫就有完全權限
++++++++++++++++++
授權信息存儲在mysql庫裏
user 授權用戶的訪問權限
db 授權用戶對庫的訪問權限
tables_priv 授權用戶對錶的訪問權限
columns_priv 授權用戶對字段的訪問權限
查看已有的授權用戶和連接的客戶端地址:
select user,host from mysql.user;
mysql> select user from mysql.user;
+---------+
| user |
+---------+
| student |
| root |
| root |
| root |
| weadmin |
| weadmin |
| root |
| jb |
| plj |
| root |
+---------+
mysql> select user,host from mysql.user;
+---------+---------------+
| user | host |
+---------+---------------+
| student | % |
| root | 127.0.0.1 |
| root | 19.tedu.cn |
| root | 192.168.4.254 |
| weadmin | 192.168.4.254 |
| weadmin | 192.168.4.5 |
| root | ::1 |
| jb | localhost |
| plj | localhost |
| root | localhost |
+---------+---------------+
查看已有授權用戶的訪問權限:
show grants for 用戶@"客戶端地址";
mysql> show grants for student@"%";
沒有明確授權時,用戶不能管理test庫,
mysql> delete from mysql.db where user="";
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
撤銷用戶的權限:
revoke 權限列表 on 庫名 from 用戶@"客戶端地址";
revoke grant option on *.* from 'root'@'172.40.50.117';
revoke drop,delete on *.* from 'root'@'172.40.50.117';
revoke all on *.* from 'root'@'172.40.50.117';
delete from mysql.user where host="172.40.50.117" and user="root";flush privileges;
drop user 用戶;
授權用戶登錄數據庫服務器,然後修改自己的登陸密碼
SET PASSWORD=PASSWORD('新密碼');
數據庫管理員修改授權用戶的登錄密碼
SET PASSWORD FOR 用戶名@'客戶端地址'=PASSWORD('新密碼');
grant練習題.txt
++++++++++++++++++++++++++++++++++++++++++++++++++++++
MySQL圖形管理工具-phpMyAdmin
#yum -y install httpd php php-mysql
#service httpd start
#chkconfig httpd on
[root@stu ~]# cat /var/www/html/linkdb.php
<?php
$linkdb=mysql_connect("localhost","root","123456");
if ($linkdb){
echo "linkdb ok";
}else{
echo "linkdb no";
}
?>
[root@stu ~]# elinks --dump http://localhost/linkdb.php
linkdb ok
[root@stu ~]#
#tar -zxvf phpMyAdmin-2.11.11-all-languages.tar.gz
#mv phpMyAdmin-2.11.11-all-languages /var/www/html/phpmyadmin
#cd /var/www/html/
#chown -R apache:apache phpmyadmin/
修改配置
cd /var/www/html/phpmyadmin/
cp config.sample.inc.php config.inc.php
vim config.inc.php
17 $cfg['blowfish_secret'] = 'plj123';
31 $cfg['Servers'][$i]['host'] = 'localhost';
:wq
#mysql -uroot -p999
#mysql> create database bbsdb;
mysql> grant all on bbsdb.* to webadmin@"localhost" identified by "123";
客戶端訪問:
http://172.40.50.171/phpmyadmin
webadmin
123
++++++++++++++++++++++++++++++++++++++++++++
day04課程內容回顧:
多表查詢:
select 字段名列表 from 表名列表 where 條件;
select 字段名列表 from 表名 left join 表名 on 條件
select 字段名列表 from 表名 right join 表名 on 條件
恢復數據庫管理員本機登錄密碼。
修改數據庫管理員本機登錄密碼。
用戶授權:
爲什麼要做授權?
給誰授權?
默認誰授權權限?
授權命令的語法格式?
grant 權限列表 on 數據庫名 to 用戶名;
grant 權限列表 on 數據庫名 to 用戶名@"客戶端地址" identified by "密碼" with grant option ;
權限撤銷:
* 對目標庫有過授權纔可以撤銷
* 撤銷的只是權限
revoke 權限列表 on 數據庫名 from 用戶名@"客戶端地址";
show grants ;
select user,host from mysql.user;
show grants for 用戶名@"客戶端地址";
授權信息存儲在mysql數據庫裏,使用不同的表存儲不同授權信息。
user db tables_priv columon_priv
安裝phpmyadmin圖形管理工具
yum -y install httpd php php-mysql
++++++++++++++++++++++++++++++++++++++++++++++++++++
day05
數據備份與恢復
實時增量備份
XtraBackup 備份
mysql主從同步
+++++++++++++++++
數據備份與恢復
爲什麼要對數據做備份?數據庫丟失時能夠使用備份文件恢復數據。
備份方式:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
物理備份:直接拷貝庫或表對應的文件。 (1.先備份拷貝。之後如果被刪了,把所有拷貝的再覆蓋回去,數據就回來了,物理備份,若沒有拷貝被刪了,那就初始化數據恢復)
cp -r /var/lib/mysql/mysql /bakdir/++++++++++++++++++++++++++++++++++++++++++++++++++
cp /var/lib/mysql/mysql/user.* /bakdir/
tar -zcvf /bakdir/mysql.tar.gz /var/lib/mysql/mysql/*
mysqlhostcopy 物理備份命令
只適用於MyISAM引擎的表
yum -y install perl-DBD-MySQL
mysqlhotcopy -h localhost -u 用戶名 -p 密碼 庫名
mysqlhotcopy -h localhost -u 用戶名 -p 密碼 庫名 目錄名
mkdir /mydata
mysqlhotcopy -u root -p 999 userdb /mydata
使用物理備份文件恢復數據
cp -r 備份文件或文件夾 對應的數據庫目錄下
chown -R mysql:mysql /var/lib/mysql/目錄名或文件
邏輯備份:備份時,根據已有的數據生成對應的sql命令,把sql命令保存到備份文件裏。
備份策略:
完全備份 備份所有數據
一臺數據庫服務器上的所有數據
一個庫的所有數據
一張表的所有數據
差異備份 備份自完全備份後所有新產生的數據
增量備份 備份自上一次備份後所有新產生的數據
增量備份
差異備份
完全備份
生產環境中使用的備份策略?
完全備份+差異備份
完全備份+增量備份
生產環境中備份數據要考慮的因素?
備份頻率
備份時間
存儲空間
備份文件的命名
備份方式
備份策略
備份週期
完全備份+差異備份
備份時間 庫 文件名 儲存
1 完全 18:00 1 1.sql 1
2 差異 3 2.sql 3
3 5 3.sql 8
4 2 4.sql 10
5 7 5.sql 17
6 4 6.sql 21
7 差異 6 7.sql 27
完全備份+增量備份
備份時間 庫 文件名 儲存
1 完全 18:00 1 1.sql 1
2 增量 3 2.sql 3
3 5 3.sql 5
4 2 4.sql 2
5 7 5.sql 7
6 4 6.sql 4
7 增量 6 7.sql 6
生產環中備份數據的手段?
計劃任務 + 備份腳本
00 23 * * 1 /root/allbakdb.sh
30 23 * * 2-7 /root/newbakdb.sh
+++++++++++++++++++++++++++++++++++++++++++++++++
完全備份數據命令:
mysqldump -uroot -p999 數據庫名 > 目錄/名.sql
數據庫名的表示方式?
--all-databases 一臺數據庫服務器上的所有數據
數據庫名 一個庫的所有數據 userdb
庫名 表名 一張表的所有數據 userdb student
-B 數據庫名1 數據庫名2 數據庫名N 一起備份多個庫的數據
#mysqldump -uroot -p999 --all-databases > alldb.sql
#mysqldump -uroot -p999 userdb student > student.sql
#mysqldump -uroot -p999 -B userdb gamedb > twodb.sql
#mkdir /mydata
#mysqldump -uroot -p999 userdb > /mydata/userdb.sql
create database db_name;
use db_name;
完全恢復數據命令
#mysql -uroot -p999 < 名.sql
#mysql -uroot -p999 庫名 < 目錄/名.sql
#mysql -uroot -p999 userdb < userdb.sql
++++++++++++++++++++++++++++++++++++++++++++
crontab -e
00 23 * * 1 /root/allbakdb.sh &> /dev/null
:wq
vim /root/allbakdb.sh
#!/bin/bash
day=`date +%F`
if [ ! -e /bakdbdir ];then
mkdir /bakdbdir
fi
mysqldump -uroot -p999 userdb > /bakdbdir/${day}-userdb.sql
:wq
chmod +x /root/allbakdb.sh
/root/allbakdb.sh
++++++++++++++++++++++++++++++++++++++++++++++++++
實時增量備份
(啓用mysql服務的binlog日誌實現對數據的增量備份)
(二進制日誌)
binlog日誌? 是mysql服務日誌中的一種。記錄客戶端連接數據庫服務器後,執行的除查詢之外的sql命令。
查詢的命令 : select desc show
不是查詢的sql命令如下:
create
use
insert into
delete
drop
grant
load data
啓用binlog日誌? (日誌編號範圍1-999999)
vim /etc/my.cnf
[mysqld]
#log-bin
log-bin=/mylog/plj
:wq
mkdir /mylog
chown mysql:mysql /mylog
service mysql restart
stu-bin.000001 binlog日>500M
stu-bin.000002
stu-bin.index 日誌索引文件
查看binlog日誌文件內容?
mysqlbinlog stu-bin.000001
+++++++++++++++++++++++++++++++++++
手動生成新的binlog日誌文件?
mysql> flush logs;
#mysql -uroot -p999 -e "flush logs"
#mysqldump -uroot -p999 --flush-logs 庫名 > xxx.sql
#service mysql restart
刪除指定binlog日誌編號之前的日誌文件?
mysql> PURGE MASTER LOGS TO "binlog文件";
mysql> purge master logs to "plj.000003";
刪除當前所有的binlog日誌文件,重新創建第1個binlog日誌文件
mysql>reset master;
#rm -rf binlog日誌文件名
+++++++++++++++++++++++++++++
binlog日誌文件記錄sql命令的方法?
字符偏移量
記錄sql命令執行時間
使用binlog日誌恢復數據?
mysqlbinlog 選項 binlog日誌名 | mysql -uroot -p999 [數據庫名]
選項
--start-position=pos值
--stop-position=pos值
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-datetime="yyyy-mm-dd hh:mm:ss"
mysqlbinlog --start-position=964 --stop-position=1144 plj.000002 | mysql -uroot -p999
課後作業 binlog日誌練習題
完全備份+增量備份
00 23 * * 1 /root/allbakdb.sh #週一做完全備份
30 23 * * 2-7 /root/newbakbinlog.sh #周2-7做增量備份
/root/newbakbinlog.sh腳本的功能:
拷貝每天新生成的binlog日誌文件到系統的/mylogdir目錄下,如果拷貝的binlog日誌文件是正在使用的不拷貝。
搭建2臺數據庫服務器,啓動數據庫服務並設置管理員root用戶從本機登錄密碼是123456,2臺數據庫服務器能夠ping通。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
安裝第三方軟件XtraBackup對數據做增量備份
XtraBackup介紹:
在線熱備份工具,備份過程中不鎖庫表,
只備份表記錄,不備份表結構
表的存儲引擎必須是InnoDB/XtraDB
必須先有一次完全備份,這樣再執行備份時才知道那些數據是新產生。
安裝XtraBackup: perl(DBD::mysql) perl(Time::HiRes) 安裝兩個依賴包
rpm -q perl-Time-HiRes
rpm -ivh percona-xtrabackup-2.1.6-702.rhel6.x86_64.rpm
提供2個備份命令:
xtrabackup:C程序,支持InnoDB/XtraDB
innobackupex:以Perl腳本封裝xtrabackup,還支持MyISAM
xtrabackup_56 命令語法格式:
(完全備份 完全恢復 增量備份 增量恢復)
xtrabackup_56 <選項>
--backup 備份數據
--prepare 恢復數據
--target-dir=目錄名 指定備份文件存儲的目錄
--datadir=/var/lib/mysql 指定數據庫目錄的位置
--incremental-basedir=目錄名 增量備份時,指定上一次備份文件存儲的目錄
--incremental-dir=目錄名 增量恢復數據時,指定使用恢復文件所在的目錄
db1.a 5 -> 999 完全備份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/allbak
10 -> 301 第1次增量備份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/new1 --incremental-basedir=/allbak
8 -> 801 第2次增量備份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/new2 --incremental-basedir=/new1
3 -> 777 第3次增量備份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/new3 --incremental-basedir=/new2
xtrabackup 備份數據時,時如何解決如下問題的:
執行備份時,如何知道,是否有新記錄插入?
在備份數據時如何知道在所有記錄裏,那些記錄是新產生的?
備份數據分爲2部分
1 日誌信息
2 數據
/var/lib/mysql/
事務日誌文件 ib_logfile1
ib_logfile2
日誌信息文件 ibdata1
LSN 日誌序列號
工作過程:
備份目錄 /allbak /new1 /new2 /new3
xtrabackup_checkpoints #當前的備份類型和LSN的範圍
xtrabackup_logfile #SQL命令
ibdata1.* #數據信息
庫名/表名.ibd.* #真實數據
delete from bbsdb.a;
++++++++++++++++++++++++++++++++++++++++++++++++++
xtrabackup恢復數據的步驟:
1 準備恢復數據
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak --incremental-dir=/new1
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak --incremental-dir=/new2
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak --incremental-dir=/new3
2 把備份文件拷貝回對應的數據庫目錄下
[root@stu ~]# cp /allbak/bbsdb/a.ibd /var/lib/mysql/bbsdb/
cp:是否覆蓋"/var/lib/mysql/bbsdb/a.ibd"? y
[root@stu ~]#
3 重啓數據庫服務
service mysql restart
4 查看恢復是否成功
select * from bbsdb.a;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
把數據庫服務器107配置爲 171的從數據庫服務器。
1 在107主機上運行mysql數據庫服務器。
rpm -Uvh Mysql-*.rpm
service mysql start ; chkconfig mysql on
cat /root/.mysql_secret
mysql -uroot -pXXXXX
mysql> set password for root@"localhost"=password("999");
mysql>quit
mysql -uroot -p999
mysql> show databases;
mysql>quit
ping 172.40.50.171
setenforce 0
service iptables stop
171 的配置
mysqldump -uroot -p123 bbsdb > /root/bbsdb.sql
scp /root/bbsdb.sql [email protected]:/root/
107:
mysql -uroot -p999
mysql> create database bbsdb;
mysql> quit;
#mysql -uroot -p999 bbsdb < /root/bbsdb.sql
把171配置爲主(master)數據庫服務器
#vim /etc/my.cnf
[mysqld]
log-bin=master171
server_id=171
:wq
#service mysql restart
#mysql -uroot -p123
mysql> grant replication slave on *.* to slaveuser@"172.40.50.107" identified by "123456";
mysql>show master status\G;
*************************** 1. row ***************************
File: master171.000001
Position: 335
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
配置從數據庫服務器 107
mysql -h172.40.50.171 -uslaveuser -p123456
mysql> quit;
vim /etc/my.cnf
[mysqld]
server_id=107
log-bin=jing #可選項
:wq
service mysql restart
mysql -uroot -p999
mysql> show slave status;
Empty set (0.00 sec)
mysql> change master to
master_host="172.40.50.171",
master_user="slaveuser",
master_password="123456",
master_log_file="master171.000001",
master_log_pos=335;
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
171驗證配置
mysql -uroot -p123
mysql>grant all on *.* to jingyaya@"%" identified by "123";
主從同步的工作過程
Slave_IO_Running: Yes
IO線程:負責把主數據庫服務器binlog日誌裏的sql命令拷貝到本機的中繼日誌文件裏。
IO線程 No狀態的原因?
從數據庫服務器連接不上主數據庫服務器:
ping
iptables
selinux
連接的授權用戶
binlog日誌文件指定錯誤
binlog日誌pos點位置錯誤
查看報錯信息
Last_IO_Error: 報錯信息
修改錯誤:
stop slave;
change master to 選項="值",選項="值",;
start slave;
Slave_SQL_Running: Yes
SQL線程:執行本機中繼日誌文件裏的sql命令,把數據寫進本機的庫裏。
IO線程 No狀態的原因?
執行本機中繼日誌文件裏的sql命令時,本機沒有命令使用到的庫 表 或字段。
查看報錯信息
Last_SQL_Error: 報錯信息
ls /var/lib/mysql/
master.info 記錄連接主數據庫服務器配置信息
relay-log.info 記錄中繼日誌信息文件
mail-relay-bin.00000x 中繼日誌文件
mail-relay-bin.index 中繼日誌的索引文件
主從同步結構模式:
一主一從 *
一主多從 *
主從從
主主結構
+++++++++++++++++++++++++
day05課程內容回顧:
數據的備份與數據恢復
備份方式 ?
物理備份: cp tar mysqlhotcopy
邏輯備份: 備份時把庫表記錄對應sql命令保
存 到備份文件
備份策略?
完全備份 mysqldump
增量備份 binlog
差異備份
binlog使用:
binlog日誌 ? 啓用 ? 查看內容 ?
記錄sql命令的方法?
手動生成新的binlog日誌文件?
刪除已有的binlog日誌文件?
執行binlog日誌文件sql命令恢復數據?
XtraBackup 備份
mysql主從同步
++++++++++++++++++++++++++++++++++++++++++++++++++
day06
mysql主從同步常用配置參數
vim /etc/my.cnf
[mysqld]
.....
:wq
service mysql restart
主數據庫服務器的使用參數
binlog-do-db=數據庫名,數據庫名 #只允許同步的庫
binlog-ignore-db=數據庫名,數據庫名 #只不允許同步的庫
從數據庫服務器的使用參數:
log-slave-updates 級聯複製
replicate-do-db=數據庫名,數據庫名 #只同步的庫
replicate-ignore-db=數據庫名,數據庫名 #只不同步的庫
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
使用mysql代理服務實現數據讀寫分離
客戶端
|
代理117
|
|
-------------------------------------
| |
寫117 讀107
在117主機上運行mysql代理服務。
服務運行時,把接收到的讀請求給後端的數據庫服務器107 把接收到的寫請求給後端的數據庫服務器171
117:
#tar -zxvf mysql-proxy-tar.gz
#mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit/ /usr/local/mysqlproxy
# rpm -q lua || yum -y install lua
#chmod +x /usr/local/mysqlproxy/share/doc/mysql-proxy/rw-splitting.lua
啓動mysql代理服務
#rpm -qa | grep -i mysql-server
#netstat -utnalp | grep :3306
#service mysql stop ; chkconfig mysql off
#/usr/local/mysqlproxy/bin/mysql-proxy
-P 172.40.50.117:3306
-r 172.40.50.107:3306
-b 172.40.50.171:3306
-s /usr/local/mysqlproxy/share/doc/mysql-proxy/rw-splitting.lua &
[root@room9pc00 ~]# netstat -utnalp | grep :3306
tcp 0 0 172.40.50.117:3306 0.0.0.0:* LISTEN 32524/mysql-proxy
[root@room9pc00 ~]#
停止服務
pkill -9 mysql-proxy
kill -9 %後臺運行編號
107 + 171
mysql -uroot -p密碼
mysql> grant all on *.* to jim@"%" identified by "123";
客戶端訪問
mysql -h172.40.50.117 -ujim -p123
mysql> select * from gamedb.a; -> 107
mysql> insert gamedb.a values(88);-> 171
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
day07
部署mysql高可用集羣。
mysql MMM + mysql主從同步
環境配置:
4臺數據庫服務器 171 107 99 23
service mysql start
mysql -uroot -p密碼
把多餘庫都刪除只留默認的4個數據庫
下載軟件包 mysql-mmm.zip
配置yum源
yum -y install perl-*
二 、mysql主從同步:
2.1 171 和 107 配置爲主主結構
171配置爲107的主
171:
grant replication slave on *.* to slaveuser@"%" identified by "123456";
[root@stu mysql]# cat /etc/my.cnf
[mysqld]
log-bin=master171
server_id=171
[root@stu mysql]# service mysql restart
107:
grant replication slave on *.* to slaveuser@"%" identified by "123456";
vim /etc/my.cnf
[mysqld]
server_id=107
log-bin=master107
log-slave-updates
:wq
[root@stu mysql]# service mysql restart
mysql -uroot -p999
mysql> change master to master_host="172.40.50.171",master_user="slaveuser",master_password="123456",master_log_file="master171.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
171: 把自己設置爲107的從庫
mysql -uroot -p999
mysql> change master to master_host="172.40.50.107",master_user="slaveuser",master_password="123456",master_log_file="master107.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
2.2 99 和 23 同時配置爲 107 的從庫
99:
vim /etc/my.cnf
[mysqld]
server_id=99
:wq
/etc/init.d/mysql restart
mysql -uroot -p123
mysql> change master to master_host="172.40.50.107",master_user="slaveuser",master_password="123456",master_log_file="master107.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
23:
vim /etc/my.cnf
[mysqld]
server_id=23
:wq
/etc/init.d/mysql restart
mysql -uroot -p123
mysql> change master to master_host="172.40.50.107",master_user="slaveuser",master_password="123456",master_log_file="master107.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
三、測試主從同步的配置
171 :
mysql -uroot -p999
mysql> grant all on bbsdb.* to lili@"%" identified by "123";
107 / 99 / 23 :
select user,host from mysql.user where user="lili";
什麼是集羣? 使用一組服務器提供相同服務
高可用集羣? 主備
負載均衡集羣?多臺服務器平均分攤客戶端的訪問請求。
四 安裝MySQL MMM
軟件介紹:MySQL主主複製管理器
監控、故障轉移 一套腳本套件(perl)
提供2種服務:
mmm-monitor: 負責所有的監控工作, 決定故障節點的移除或恢復 。
mmm-agent 運行在MySQL服務器上,提供簡單遠程服務集、提供給監控節點。
在所以主機上安裝mysql mmm 軟件 (4臺數據庫服務器 + 監控服務器)
#tar -zxvf mysql-mmm-2.2.1.tar.gz
#cd mysql-mmm-2.2.1
#make install
#cd /etc/mysql-mmm
#ls *.conf
mmm_agent.conf mmm-agent服務的主配置文件(數據庫主機)
mmm_mon.conf mmm-monitor服務的主配置文件(監控主機)
mmm_common.conf 公信息配置文件,在所有主機上都要配置
mmm_tools.conf
在四臺數據庫服務器上做如下授權
mysql>grant replication client,process,super on *.* to agent@"%" identified by "123456";
mysql>grant replication client on *.* to monitor@"%" identified by "123456";
七 在所以主機上 安裝服務運行時依賴的軟件包。
裝三個依賴包(Algorithm-Diff perl-Log-Log4perl Proc-Daemon)
[root@66 ~]# cd mysql-mmm
[root@66 mysql-mmm]# tar -zxvf Algorithm-Diff-1.1902.tar.gz
[root@66 mysql-mmm]# cd Algorithm-Diff-1.1902
[root@66 Algorithm-Diff-1.1902]# perl Makefile.PL
[root@66 Algorithm-Diff-1.1902]# make
[root@66 Algorithm-Diff-1.1902]# make install
[root@66 Algorithm-Diff-1.1902]# cd
[root@66 ~]# cd mysql-mmm
[root@66 mysql-mmm]# rpm -ivh --nodeps perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm
[root@66 mysql-mmm]# tar -zxvf Proc-Daemon-0.03.tar.gz
[root@66 mysql-mmm]# cd Proc-Daemon-0.03
[root@66 Proc-Daemon-0.03]# perl Makefile.PL
[root@66 Proc-Daemon-0.03]# make
[root@66 Proc-Daemon-0.03]# make install
___________________________________________________________________________________________________
tar -zxvf Algorithm-Diff-1.1902.tar.gz (和上面一樣操作步驟)
cd Algorithm-Diff-1.1902
perl Makefile.PL
make
make install
rpm -ivh --nodeps perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm
tar -zxvf Proc-Daemon-0.03.tar.gz
cd Proc-Daemon-0.03
perl Makefile.PL
make
make install
_____________________________________________________________
八 在4臺數據庫服務器上安裝獲取虛擬Ip地址程序。
#yum -y install gcc gcc-c++
#gunzip Net-ARP-1.0.8.tgz
#tar -xvf Net-ARP-1.0.8.tar
#cd Net-ARP-1.0.8
#perl Makefile.PL
#make
#make install
啓動服務
1 啓動數據庫服務器上mmm-agent 服務
[root@stu mysql-mmm]# /etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
[root@stu mysql-mmm]# netstat -utnalp | grep agent
tcp 0 0 172.40.50.171:9989 0.0.0.0:* LISTEN 24009/mmm_agentd
[root@stu mysql-mmm]# netstat -utnalp | grep :9989
tcp 0 0 172.40.50.171:9989 0.0.0.0:* LISTEN 24009/mmm_agentd
[root@stu mysql-mmm]#
日誌文件 /var/log/mysql-
mmm/mmm_agentd.log
2 啓動監控服務器上mmm-monitor 服務
[root@stu mysql-mmm]#
/etc/init.d/mysql-mmm-monitor start
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Ok
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# netstat -utnalp | grep :9988
tcp 0 0 172.40.50.177:9988 0.0.0.0:* LISTEN 23544/mmm_mond
[root@stu mysql-mmm]#
測試配置
177 查看數據庫服務器的狀態:
[root@stu mysql-mmm]# mmm_control show
master107(172.40.50.107) master/AWAITING_RECOVERY. Roles:
master171(172.40.50.171) master/AWAITING_RECOVERY. Roles:
slave23(172.40.50.23) slave/AWAITING_RECOVERY. Roles:
slave99(172.40.50.99) slave/AWAITING_RECOVERY. Roles:
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control set_online master171
OK: State of 'master171' changed to ONLINE. Now you can wait some time and check its new roles!
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control set_online master107
OK: State of 'master107' changed to ONLINE. Now you can wait some time and check its new roles!
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control show
master107(172.40.50.107) master/ONLINE. Roles:
master171(172.40.50.171) master/ONLINE. Roles: writer(172.40.50.100)
slave23(172.40.50.23) slave/AWAITING_RECOVERY. Roles:
slave99(172.40.50.99) slave/AWAITING_RECOVERY. Roles:
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control
set_online slave99
OK: State of 'slave99' changed to ONLINE.
Now you can wait some time and check its
new roles!
[root@stu mysql-mmm]# mmm_control
set_online slave23
OK: State of 'slave23' changed to ONLINE.
Now you can wait some time and check its
new roles!
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control
show
master107(172.40.50.107)
master/ONLINE. Roles:
master171(172.40.50.171)
master/ONLINE. Roles: writer
(172.40.50.100)
slave23(172.40.50.23) slave/ONLINE.
Roles: reader(172.40.50.102)
slave99(172.40.50.99) slave/ONLINE.
Roles: reader(172.40.50.101)
[root@stu mysql-mmm]#
查看虛擬ip地址
[root@stu Net-ARP-1.0.8]# ip addr show | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 172.40.50.171/24 brd 172.40.50.255 scope global eth0
inet 172.40.50.100/32 scope global eth0
[root@stu Net-ARP-1.0.8]#
客戶端連接虛擬IP地址172.40.50.100 訪問數據庫服務器
mysql -h172.40.50.100 -ulili -p123
mysql>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mysql性能優化:
(當一數據庫服務器處理客戶端的請求慢時可能由那些原因造成。)
網絡帶寬太窄 ? 測速軟件
服務配置低(CPU 內存 硬盤)?
查看硬件設備的使用率
top uptime df -h free -m
提供數據庫服務軟件的版本太低 ?
查看mysql數據庫服務運行時,運行參數。
數據庫服務器處理查詢請求過程?
mysql>show variables like '%commit%';
mysql>set [global] 變量名=值;
vim /etc/my.cnf
[mysqld]
變量名=值
:wq
1 併發連接數
mysql> set global max_connections=200;
mysql> show variables like
"max_connections";
mysql> show processlist;
mysql>show global status like "%
used%";
Max_used_connections/max_connections
=0.85 * 100% =85%
2連接超時時間
connect_timeout 建立連接 tcp三次握手的
超時時間
wait_timeout 建立連接後等待執行SQL命令的
超時時間
show variables like "%timeout%";
3 可用重複使用的線程數量
thread_cache_size=2
4 顯示與查詢相關的參數的設置
show variables like "query_cache%";
query_cache_type = 0 / 1 / 2
1
2 select 關鍵字 * from a;
query_cache_wlock_invalidate | OFF
myisam
pc1 : select name from a where name="jim";
name="jim"
pc2 select name from a where name="jim";
pc3 update a set name="lucy" where name="jim";
髒讀
T G M k 字節 位
顯示查詢緩存的統計信息?
show global status like "qcache%";
Qcache_hits | 80 |
| Qcache_inserts | 1000 |
給執行不同查詢請求的進程分配資源
mysqld 線程
select * from a; read_buffer_size
select * from a order by age desc; sort_buffer_size
select * from a where 工資>1w group by 部門 ; read_rnd_buffer_size
select name,age from a where name like "a%"; key_buffer-size
程序員編寫的訪問數據庫的sql命令太複雜導致數據庫服務器處理速度慢?
啓用MySQL服務慢查詢日誌 ,記錄超過指定時間顯示查詢結果的SQL命令。
mysql數據庫服務日誌類型4種:
錯誤日誌 : 默認就開啓,記錄服務在啓動和運行過程中產生的錯誤信息。
binlog日誌:
查詢日誌: 記錄客戶端連接數據庫服務器後,執行的所有的SQL命令。
general-log
general-log-file=名
慢查詢日誌:記錄客戶端連接數據庫服務器後,超過指定時間(10秒)顯示查詢結果的sql命令。
slow-query-log
vim /etc/my.cnf
[mysqld]
slow-query-log
general-log
#slow-query-log-file=名
#long-query-time=5
#log-queries-not-using-indexes
:wq
/etc/init.d/mysql restart
select sleep(5);
select sleep(11);
select sleep(13);
mysqldumpslow 數據庫目錄/主機名-slow.log > /tmp/sql.txt
cat 數據庫目錄/主機名-slow.log
網絡結構有問題 ?
網絡中存在單點故障
數據傳輸有瓶頸
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
體系結構組成: 連接池 sql接口 分析器 優化器 存儲引擎 文件系統 管理工具
連接池就是接收到用戶請求後,查看自己是否有空閒資源(空閒線程處理用戶的連接請求,有的話連接到sql接口) MYSQL>
SQL接口就是把用戶輸入的命令(select * from t1;),交給mysqld這個服務的。當sql命令有語法錯誤的時候,它會報錯,這是分析器提供的,當沒錯時,他就執行。當查詢的時候,他會優化這條命令(優化器)以最節省資源方式來處理你這個命令,它會到緩存裏查找(查詢緩存),有的話直接給數據,沒有的話就到表裏查(/var/lib/mysql/db1/t1.frm,文件系統),這個表會有使用的存儲引擎(innodb,mysiam),執行查詢的時候,會給這個表加讀鎖, 鎖一行還是鎖整表取決於存儲引擎。這時它就工作了。它會把當前查找到的數據先放到查詢緩存裏,然後再給客戶端。這個就是整個工作過程。
管理工具 。輸mysql按兩次tab它會把所有mysql開頭的都顯示出來,這些就是mysql服務自帶的命令,就是mysql的管理工具,登入的是mysql,改密碼是mysqladmin,按什麼包可以改密碼,下面的..這就是管理工具。
[root@proxe ~]# mysql
mysql mysql_embedded
mysqlaccess mysql_find_rows
mysqlaccess.conf mysql_fix_extensions
mysqladmin mysqlhotcopy
mysqlbinlog mysqlimport
mysqlbug mysql_install_db
mysqlcheck mysql_plugin
[root@proxe ~]# which mysqladmin
/usr/bin/mysqladmin
[root@proxe ~]# rpm -qf /usr/bin/mysqladmin
MySQL-client-5.6.15-1.el6.x86_64
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
破解密碼:
[root@19 ~]# service mysql stop ++++++++++
Shutting down MySQL... SUCCESS!
[root@19 ~]# service mysql start --skip-grant-tables +++++++
Starting MySQL.. SUCCESS!
[root@19 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.15 MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> update mysql.user +++++++++++++++
-> set password=password('123456')
-> where
-> host='localhost' and user='root';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges; +++++++++++++++++++
Query OK, 0 rows affected (0.02 sec)
mysql> quit; +++++++++++++++++=
[root@19 ~]# service mysql stop++++++++++++
Shutting down MySQL.. SUCCESS!
[root@19 ~]# service mysql start++++++++++++
Starting MySQL.. SUCCESS!
[root@19 ~]# mysql -uroot -p123456 +++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
修改mysql的密碼
[root@19 ~]# mysqladmin -hlocalhost -uroot -p password "新密碼"
Enter password: 舊密碼
[root@19 ~]# mysql -uroot -p新密碼
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
授權的語法
mysql -hlocalhost -uroot -p999
mysql> grant 權限列表 on 數據庫名 to 用戶名@"客戶端地址" identified by "密碼" with grant option;
(客戶端地址,ip 密碼:登錄時密碼 它也有授權命令)
mysql> grant 權限列表 on 數據庫名 to 用戶名;
權限列表:
all 所有權限
select,update(name,age) 指定權限
usage 無權限
授權:
grant all on *.* to plj@"localhost" identified by "123456";
數據庫名:
*.* 所有庫和所有表
庫名.* 一個庫的權限
庫名.表名 一張表的權限
用戶名: 客戶端連接數據庫服務器時,使用的登陸名,授權時自定義即可,要有標識性。
客戶端地址: 可選項
% 所有地址
172.40.50.117 一個IP地址
192.168.1.% 一個網段
pc100.tedu.cn 主機名
%.tedu.cn 域名
identified by "密碼" 設置授權用戶連接時使用的密碼 可選項
with grant option 設置授權用戶連接後,有授權權限 可選項
select user(); 顯示登陸的用戶名和客戶端地址;
show grants; 登陸數據庫服務器的用戶查看自己的訪問權限
mysql> select user(); +++++++++++++++查看當前用戶
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql> show grants; ++++++++++++++++++查看當前用戶權限
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
1.給plj用戶使用特定的密碼在本機登錄對所有的庫的操作權限。
mysql> grant all on *.* to plj@"localhost" identified by "123456"; ++++++
Query OK, 0 rows affected (0.00 sec)
mysql> quit;
Bye
[root@19 ~]# mysql -uplj -p123456
mysql> select user();
+---------------+
| user() |
+---------------+
| plj@localhost |
+---------------+
1 row in set (0.00 sec)
mysql> show grants;
+---------------------------------------------------------------------------------------------------------------------+
| Grants for plj@localhost |
+---------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'plj'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+---------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2. 給 管理者(DAB)權限 特定主機特定用戶和密碼擁有所有權限。
mysql> grant all on *.* to root@"192.168.4.254" identified by "123456" with grant option; +++++++++++++++
Query OK, 0 rows affected (0.08 sec
實驗:
[root@room1pc01 桌面]# mysql -h"192.168.4.19" -uroot -p123456
1 row in set (0.00 sec)
mysql> select user(); 查看當前用戶和主機ip
+--------------------+
| user() |
+--------------------+
+--------------------+
1 row in set (0.00 sec)
mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
3.給使用者(網站服務器)特定的權限 使用設置的用戶密碼和ip主機,有wedbd庫下所有權限。
設置權限:
mysql> grant all on wedbd.* to weadmin@"192.168.4.5" identified by "123456";
實驗:
[root@proxe ~]# mysql -h192.168.4.19 -uweadmin -p123456
mysql> select user();
+---------------------+
| user() |
+---------------------+
+---------------------+
1 row in set (0.03 sec)
mysql> show grants;
+------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'weadmin'@'192.168.4.5' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT ALL PRIVILEGES ON `wedbd`.* TO 'weadmin'@'192.168.4.5' |
+------------------------------------------------------------------------------------------------------------------+
4.設置student用戶在任何主機不用輸密碼可直接登入
mysql>grant select,update(name,uid) on userdb.user to student; +++++++只對userdb.user表有select,update(name,uid)權限,默認設置時先要存在該表和該字段,設置才能成功)
[root@room1pc01 桌面]# mysql -ustudent
——————————————————————————————————————————————————————————————————————
注意測試時:都要裝mysql連接工具,就可以連接授權的mysql數據庫。
[root@room1pc01 桌面]# yum -y install mysql
[root@room1pc01 桌面]# which mysql
/usr/bin/mysql
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++