mysql 實用

( 靜靜 )

 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()             |

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

| [email protected] |

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

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()              |

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

| [email protected] |

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

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

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章