mariadb

數據庫結構模型分類
1、層次模型
2、網狀模型
3、關係模型
關係模型的組成部分

二維關係

row
column


索引
index


視圖
view (只包含固定字段,不包含其他字段)



關係型數據庫的常見組件:


數據庫 : Database

表 : table

行 : row

列 : column


索引 : index

視圖 : view

用戶 : user

權限 : privilege

存儲過程 : procedure

存儲函數 : function

觸發器 : trigger

事件調度器 : event schedule

DBA的組成部分

SQL引擎
分析器
計劃執行器
優化器
操作求解器


存儲引擎
文件和存儲接口
緩衝管理器
磁盤空間管理器
恢復管理器
事務管理器
鎖管理器


SQL接口(structured query Language)
類似於OS的shell接口,操作數據庫的數據接口,也提供了編程功能


SQL接口語言的標準(其由ANSL組織定義)

SQL86
SQL89
SQL92
SQL99
SQL03


SQL接口的語言分類

DDL:(Data Defined Language)
create
alter
drop


DML:(Data Manapulating Language)
insert
delete
update
select


DCL: (Data Control Language)
grant
revoke



DB是否支持事務的測試標準


ACID

A : 原子性 --> 不可分割的整體
C : 一致性 --> 數據的變化是一致性的
I : 隔離性 --> 事務彼此之間是隔離的
D : 持久性 --> 只要一個事務完成,它都是持久完成的。


事務是將組織多個操作爲一個整體,要麼全部執行,要全部不執行。其實現機制爲:

回滾機制
事務機制


RDBMS設計範式基礎概念
設計關係數據庫時,遵從不同的規範要求,設計出合理的關係型數據庫,這些不同的規範要求被稱爲不同的範式,各種範式呈遞次規範,越高的範式數據庫冗餘越小。目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。滿足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步滿足更多規範要求的稱爲第二範式(2NF),其餘範式以次類推。一般說來,數據庫只需滿足第三範式(3NF)就行了。

1) 第一範式(1NF)
所謂第一範式(1NF)是指在關係模型中,對域添加的一個規範要求,所有的域都應該是原子性的,即數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。即實體中的某個屬性有多個值時,必須拆分爲不同的屬性。在符合第一範式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一範式就是無重複的域,並不可分析


2) 第二範式 (2NF)
第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足第二範式(2NF)必須先滿足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每個實例或記錄必須可以被唯一地區分,即不能有兩個行是一樣的。選取一個能區分每個實體的屬性或屬性組,作爲實體的唯一標識。


3) 第三範式 (3NF)
第三範式(3NF)是第二範式(2NF)的一個子集,即滿足第三範式(3NF)必須滿足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個關係中不包含已在其它關係已包含的非主關鍵字信息。簡而言之,不依賴於非主屬性,表與子表中不能有相同的字段。


數據庫的運行模型:
數據庫爲C/S架構,如下:

S : server ,監聽於套接字止,接收並處理客戶端的應用請求
C : Client
程序接口
CLI
GUI


應用編程接口
ODBC : Open Database Connection(開放式數據互聯)



MYSQL的工作模型

單進程多線程
用戶連接通過線程實現
一個線程池可以定義mysql的併發連接
處理用戶連接的叫連接線程
數據字典:數據一切的元數據信息,依賴mysql庫來存儲

數據庫的基礎概念

1)約束 : Constraint

主鍵 : 一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行,且必須提供數據,即NOT NULL


唯一鍵 : 一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行,允許爲null


外鍵 : 一個表中的某字段可填入數據取決於另一個表中的主鍵已有的數據。

檢查性約束 : 表達式約束,取決於表達式的要求


2) 索引 : 將表中的一個或多個字段中的數據複製一份另存,並且這些字段需要按特定的次序排序存儲,常見的索引類型:

樹形索引(MariaDB默認爲Btree索引)

bash索引索引有利於讀請求,但不得寫請求


3) 關係運算

選擇 : 挑選出符合條件的行(部分)

投影 : 挑選出需要的字段

連接 : 將多張表關聯起來
內連接
外連接
左外連接
右外連接


自連接



4)數據抽象 :

物理層 : 決定數據的存儲格式,即RDBMS    在磁盤上如何組織文件

邏輯層 : 描述DB存儲什麼數據,以及數據間存在什麼樣的關係

視圖層 : 描述DB中的部分數據


5) 關係模型的分類
關係模型
實體關係模型
基於對象的關係模型

半結構化的關係模型
XML格式就是一種半結構化數據



常見的RDBMS數據庫

MySQL
MariaDB
PostgreSQL(pgsql)
Oracle
MSSQL

=============
MariaDB的特性

插件式存儲引擎(注:存儲引擎也稱之爲"表類型")

MYISAM --> Aria
不支持事務


INNODB --> XtraDB
支持事務



諸多擴展和新特性
提供了更多的測試組件
truly open source

Mariadb的安裝
通用二進制格式安裝過程
a. 準備數據目錄
    以/mydata/data爲例;
b. 配置mariadb
                    # groupadd -r -g 306 mysql
                    # useradd -r -g 306 -u 306 mysql
                    # tar xf mariadb-VERSION.tar.xz -C /usr/local
                    # ln -sv mariadb-version mysql
                    # cd /usr/local/mysql
                    # chown -R root:mysql ./*
                    # scripts/mysql_install_db --datadir=/mydata/data --user=mysql
                    # cp supper-files/mysql.server /etc/rc.d/init.d/mysqld
                    # chkconfig --add mysqld
c. 準備配置文件
    配置格式:類ini格式,爲各程序均通過單個配置文件提供配置信息;
    [prog_name]

能用二進制格式安裝,配置文件查找次序:
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf

OS提供的mariadb rpm包安裝的配置文件查找次序:
/etc/mysql/my.cnf --> /etc/my.cnf --> --default-extra=/PATH/TO/conf_file --> ~/my.cnf

以上兩者越靠後就是最後生效的.

                    # mkdir /etc/mysql
                    # cp support-files/my-large.cnf /etc/mysql/my.cnf

                    添加三個選項:
                        [mysqld]
                        datadir = /mydata/data
                        innodb_file_per_table = on
                        skip_name_resolve = on
MariDB程序的組成


Client

mysql : CLI交互式客戶端程序

mysqldump : 備份工具

mysqladmin: 管理工具

mysqlbinlog : 查看二進制日誌工具


Server

mysqld: 服務端進程

mysqld_safe : 服務端進程,默認也是運行的此進程

mysqld_multi : 服務端進程, 多實例

mysql_upgrade : 升級工具


服務端監聽的兩種socket地址


ip socket
監聽在3306/tcp,支持遠程通信


unix socket
監聽在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),僅支持本地通信,通信主機爲localhost,127.0.0.1都基於unix socket文件通信


命令行交互式客戶端程序---mysql工具


options

-uUSERNAME : 用戶名,默認爲root

-hHOST : 服務器主機,默認爲localhost

-pPASSWD : 用戶的密碼

dDB_NAME: 連接到服務端之後,指明默認數據庫

-e 'SCRIPT' : 連接至MYSQL運行某命令後,直接退出,並返回結果````mysql -uroot -h127.0.0.1 -pmagedu -e 'show databases;'


注意: mysql的用戶帳號由兩部分組成,'username'@'hostname',其中host用於限制此用戶可通過哪些主機連接當前的MSYQL服務器


支持通配符:


% : 匹配任意長度的任意字符
172.16.%.%


_ : 匹配任意單個字符


內置命令

\u DB_NAME : 設定哪個庫爲默認數據庫

\q : 退出

\d CHAR : 設定新的語句結束符

\g : 語句通用結束標記

\G : 語句結束標記,但以豎排方式顯示

\s : 返回客戶端與服務端的連接狀態

\c : 取消命令運行


通過mysql協議發往服務器執行並取回結果,每個命令都必須有結束符,默認爲";",示例如下:

for i in {1..100};do AGE=$[$RANDOM%100];mysql -uroot -pM8T9cw -e "insert mydb.student(id,name,age) value ($i,\"stu$i\",$AGE);"; done


獲取命令幫助
help


SQL中的數據類型


字符型
定長字符型 : (最多255個字符)

CHAR(#) : 不區分字符大小寫

BINARY(#) : 區分字符大小寫


可變長字符型 :

VARCHAR(#) : 不區分字符大小寫,需要在字符長度加1,最多65536個字符

VARBINARY(#) : 區分字符大小寫,需要在字符長度加1,最多65536個字符

TEXT : 可存文本(2^32)個字符,只能存純文本,不區分大小寫
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT


BLOB : 文本(2^32)個字符,可以存儲圖片



內置類型

SET : 集合

ENUM : 枚舉


數值型

精確數值型

INT

TINYINT : 一個字節

SMALLINT : 二個字節

MEDINUMINT : 三個字節

INT : 四個字節

BIGINT : 八個字節



近似數據型

FLOAT : 單精度

DOBULE : 雙精度



日期時間型

DATE : 日期型

TIME : 時間型

DATETIME : 日期時間型

TIMESTAMP : 時間戳(從過去到現在經過的秒數)

YEAR(2) : 2位年數

YEAR(4) : 4位年數


數據類型修飾符
所有類型都適用:

NOT NULL : 非空

DEFAULT value : 默認值


數值型適用

AUTO_INCREMENT : 自增長

UNSIGNED : 無符號,通常用於Int後面,進行修飾爲正整數


字段修飾符

PRIMARY KEY : 主鍵定義

UNIQUE KEY : 唯一鍵定義



==========
數據庫操作語言
數據庫操作

使用格式

create database | schema [if not exists]'DB_NAME';
drop database | schema 'DB_NAME';

查看數據庫
show databases;


創建數據庫
create database mydb;


刪除數據庫
drop database mydb;


查看支持的所有字符集
show character set;


查看支持的所有排序規則
show collation;


修改數據庫的默認字符集
alter database testdb character set utf32;


修改數據庫的默認字符排序規則
alter database testdb collate utf32_sinhala_ci;


表操作

使用格式

create table [if not exists] tb_name (col1 datatype 修飾符, col2 datatype 修飾符) engine=' '

查看所有的引擎(被支持的)
show engines


查看所有數據庫中的表
show tables;
show tables from mysql;


查看錶結構
desc students;


創建表
create table students(id int unsigned not null primary key, name varchar(30) not null, age tinyint unsigned not null,gender enum('F','M'))


向表中添加字段
alter table students add second_name char(30);


向表中刪除字段
alter table students drop second_name;


對錶添加主鍵
alter table students2 add primary key (id);


對錶刪除主鍵
alter table students2 drop primary key;


對錶添加索引
alter table students2 add index name (name);


對錶刪除索引
alter table students2 drop index name;
drop index name on students2;


對錶添加唯一鍵
alter table students drop second_name;


對錶刪除唯一鍵
alter table students drop index name;


修改字段字義屬性

alter table students modify name char(20);
alter table students2 change name new_name char(20) after id;

alter table students2 change name new_name char(20);
modify : 只可以修改字段定義的屬性
change : 可以修改字段名稱和定義的字段屬性


查看錶狀態
show table status like 'students2'\G


修改表引擎
alter table students2 engine[=]myisam;


查看錶的字段描述
desc students;


查看庫中的所有表
show tables
show tables from mysql;


刪除表
drop table students2;


向表中插入數據

insert weizi value(1,'zhen',30,'F');
insert weizi values(3,'wei',30,'F'),(4,'ping',31,'F');
insert weizi (id,name) value (5,"weizi");

刪除表中的數據

delete from weizi where name="zhen";
delete from weizi where age is null;
delete from weizi where age > 30;
delete from weizi where id >=50 and age <=20;

delete from weizi order by age asc limit 5;

修改表中的字段值

update weizi set age=35 where id=3 and age=30;
update weizi set age=age-5 where age=35;
update weizi age=age-age;
update weizi set age=age-5 where order by id desc limit 10;
update weizi set age=age-15 where name not like 'stu%';

Select操作語句

使用格式

select col1,col2,....from tb1_name [where clause] [order y 'col_name'] [limit [m,]n]

字段表示法   

* : 表示所有字段

as : 字段別名, col1 as alias1


where clause

操作符:
==
<
>
<=
>=
!=
between....and...


條件邏輯操作
and
or
not


模糊匹配

like

%
_


rlike 'pattern' : 基於正則表達式匹配

is null
is no null



排序

desc : 降序

asc : 升序


Select示例

select name,age from students where age >30 and age<80;
select name,age from students where age between 30 and  80;
select name from students where name like '%ang%';
select name from students where name rlike '^.*ang.*$;
select name,age from students where age is null;
select name,age form students where age is not null;
select id,name from students order by name;
select id,name from students order by name desc;

權限及授權管理

用戶表示方法:

username@host

管理權限的分類
管理權限
數據庫

字段
存儲例程


授權:

授權語法格式

grant pri_type,...on [object_type] db_name.tbl_name to 'user'@'host' [identified by 'PASSWD']

pri_type

all privileges : 表示全部權限


db_name.tbl_name的表示方法:

*.* : 所有庫的所有表

db_name.* : 指定庫的所有表

db_name.tbl_name : 指定庫的特定表

db_name.routine_name : 指定庫上的存儲過程或存儲函數


object_type
table
function
procedure




授權示例:
grant all privileges on mydb.* to 'zhenping'@'172.16.%.%' identified by 'MT8ddd';


取消權限

取消授權語法格式
revoke pri_type,.... on db_name.tb_name from 'user'@'host';


取消授權示例:
revoke all privileges on mydb.* from 'zhenping'@'172.16.%.%';


查看用戶權限

show grants for 'user'@'host';

讓新授權的權限立即生效

flush privileges;

1 Mariadb服務進程啓動時會讀取mysql庫中的所有授權表至內存中;
2 grant和revoke等執行權限操作時會保存於表中,mariadb的服務進程會自動重讀授權表
3 對於不能夠或不能及時重讀授權表,可手動讓服務進程重啓授權表,使用flush privileges
番外往篇
在CentOS 6 上手動編譯安裝mysql

    首先關閉之前啓動的mysql服務,並且將其卸載

    [root@localhost php.d]# service mysqld stop

    [root@localhost ~]# rpm -e mysql-server
    warning: /var/log/mysqld.log saved as /var/log/mysqld.log.rpmsave

    爲了徹底刪除,我們也要將它產生的日誌文件也給刪了

    [root@localhost ~]# rm -f /var/log/mysqld.log.rpmsave

    下載mariadb的源碼包( mariadb-5.5.43-linux-x86_64.tar.gz),然後創建一個系統用戶

    [root@localhost ~]# groupadd -r mysql

    [root@localhost ~]# id mysql
    uid=27(mysql) gid=27(mysql) groups=27(mysql)

    將源碼包解壓縮至指定的目錄

    [root@localhost ~]# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local

    爲解壓縮出來的目錄做一個鏈接,因爲我們用到相關文件時,引用的名稱爲mysql

    [root@localhost ~]# cd /usr/local

    [root@localhost local]# ln -sv mariadb-5.5.43-linux-x86_64 mysql

    將mysql目錄下的文件修改其權限

    [root@localhost mysql]# chown -R root:mysql ./*

    接下來我們就要創建mysql的專用數據存儲目錄了。這個很明顯,存放數據的目錄當然要單獨分區,在此處,我們將它放在LVM2上

    我們重新掛載上一個硬盤/dev/sdb,將其分成兩個區,並調整爲8e,即LVM的格式。

    [root@localhost ~]# fdisk /dev/sdb

    創建完成後,重讀一下分區表

    [root@localhost ~]# partx -a /dev/sdb
    BLKPG: Device or resource busy
    error adding partition 1
    BLKPG: Device or resource busy
    error adding partition 2

    如此便創建成功了,接着我們將這兩個分區只作爲LVM2

    [root@localhost ~]# pvcreate /dev/sdb1
      Physical volume "/dev/sdb1" successfully created
    [root@localhost ~]# pvcreate /dev/sdb2
      Physical volume "/dev/sdb2" successfully created

    創建vg

    [root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2
      Volume group "myvg" successfully created

      創建lv

      [root@localhost ~]# lvcreate -L10G -n mydata myvg
      Logical volume "mydata" created

      我們想要在這個lvm上安裝xfs文件系統,所以先安裝這個文件系統所需要的相關文件

      [root@localhost ~]# yum install xfsprogs -y

      xfs文件系統比ext4有更好的擴展性

      [root@localhost ~]# modprobe xfs
    [root@localhost ~]# modinfo xfs
    filename:       /lib/modules/2.6.32-504.el6.x86_64/kernel/fs/xfs/xfs.ko
    license:        GPL
    description:    SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled
    author:         Silicon Graphics, Inc.
    srcversion:     4392D4D583B9D2781E4F61E
    depends:        exportfs
    vermagic:       2.6.32-504.el6.x86_64 SMP mod_unload modversions

    將lvm格式化爲xfs

    [root@localhost ~]# mkfs.xfs /dev/myvg/mydata
    meta-data=/dev/myvg/mydata       isize=256    agcount=4, agsize=655360 blks
             =                       sectsz=512   attr=2, projid32bit=0
    data     =                       bsize=4096   blocks=2621440, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0

    創建文件系統掛載目錄

    [root@localhost ~]# mkdir /mydata

    將掛載信息添加到配置文件中,使開機時自動掛載

    [root@localhost ~]# vim /etc/fstab

    /dev/myvg/mydata        /mydata                 xfs     defaults        0 0

    重讀一下配置文件,使其掛載上

    [root@localhost ~]# mount -a

    查看掛載信息

    [root@localhost ~]# mount
    /dev/mapper/myvg-mydata on /mydata type xfs (rw)

    在這個目錄下創建一個數據庫目錄

    [root@localhost mydata]# mkdir data

    修改其屬主屬組

    [root@localhost mydata]# chown mysql:mysql data
    [root@localhost mydata]# ll
    total 0
    drwxr-xr-x. 2 mysql mysql 6 Oct 11 03:37 data

    回到mysql的目錄

    [root@localhost local]# cd /usr/local/mysql/

    [root@localhost mysql]# ls scripts/
    mysql_install_db

    注意這個目錄下的此腳本,它是專門用於生成mysql初始化的

    查看這個初始化腳本的相關配置信息

    [root@localhost mysql]# scripts/mysql_install_db --help

    [root@localhost mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

    此時查看初始化生成的相關目錄,其實就是庫文件

    [root@localhost mysql]# ls /mydata/data
    aria_log.00000001  aria_log_control  mysql  performance_schema  test

    接着準備mysql的服務腳本

    [root@localhost mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

    添加上這個腳本

    [root@localhost mysql]# chkconfig --add mysqld
    [root@localhost mysql]# chkconfig --list mysqld
    mysqld             0:off    1:off    2:on    3:on    4:on    5:on    6:off

    接下來就要準備配置文件了,複製一個模板,稍作修改便可成爲配置文件

    [root@localhost mysql]# mkdir /etc/mysql
    [root@localhost mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf

    對這個配置文件,做一下針對性的修改

    [root@localhost mysql]# vim /etc/mysql/my.cnf

    其中的配置文件分爲n段

    [client]  mysqld客戶端要讀取的配置
    [mysqld]  mysqld服務器端要讀取的配置

    我們僅需要在[mysqld]中,稍作修改即可

    thread_concurrency = 8
    datadir=/mydata/data
    innodb_file_per_table=on
    skip_name_resolve=on(跳過名稱解析)

    說明:mysql每次通過客戶端進行連接時,它都會把ip地址反解成主機名,並在本地做權限檢查,這相當麻煩。所以乾脆跳過,以後主機來訪時,我們僅根據其客戶端來源ip做檢查,授權時也根據ip做授權。

    啓動mysql服務

    [root@localhost mysql]# service mysqld start

    [root@localhost mysql]# ss -tnl
    State      Recv-Q Send-Q                                   Local Address:Port                                     Peer Address:Port
    LISTEN     0      128                                                 :::22                                                 :::*    
    LISTEN     0      128                                                  *:22                                                  *:*    
    LISTEN     0      128                                          127.0.0.1:631                                                 *:*    
    LISTEN     0      128                                                ::1:631                                                :::*    
    LISTEN     0      100                                                ::1:25                                                 :::*    
    LISTEN     0      100                                          127.0.0.1:25                                                  *:*    
    LISTEN     0      128                                          127.0.0.1:6010                                                *:*    
    LISTEN     0      128                                                ::1:6010                                               :::*    
    LISTEN     0      50                                                   *:3306                                                *:*    
    LISTEN     0      128                                                 :::80                                                 :::* 

    在/usr/local/mysql/bin中有一些二進制程序

    [root@localhost mysql]# ls bin
    aria_chk       myisam_ftdump      mysqlbug                    mysqld_safe           mysql_plugin               mysql_upgrade
    aria_dump_log  myisamlog          mysqlcheck                  mysqldump             mysql_secure_installation  mysql_waitpid
    aria_ftdump    myisampack         mysql_client_test           mysqldumpslow         mysql_setpermission        mysql_zap
    aria_pack      my_print_defaults  mysql_client_test_embedded  mysql_embedded        mysqlshow                  mytop
    aria_read_log  mysql              mysql_config                mysql_find_rows       mysqlslap                  perror
    innochecksum   mysqlaccess        mysql_convert_table_format  mysql_fix_extensions  mysqltest                  replace
    msql2mysql     mysqladmin         mysqld                      mysqlhotcopy          mysqltest_embedded         resolveip
    myisamchk      mysqlbinlog        mysqld_multi                mysqlimport           mysql_tzinfo_to_sql        resolve_stack_dump

    查看相關的進程

    [root@localhost mysql]# ps aux | grep mysql
    root       2734  0.0  0.1  11472  1376 pts/0    S    04:02   0:00
                /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/mydata/data --pid-file=/mydata/data/localhost.localdomain.pid
    mysql      3135  0.3 13.2 842784 132716 pts/0   Sl   04:02   0:00
                /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/mydata/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/mydata/data/localhost.localdomain.pid --socket=/tmp/mysql.sock --port=3306
    root       3176  0.0  0.0 103252   836 pts/0    S+   04:07   0:00 grep mysql

    注意:其中含有mysqld-safe程序

    講述下/usr/local/bin/mysql,這個命令行使用的相關方法

    [root@localhost mysql]# mysql

    mysql> use mysql;
    mysql> SELECT User,Host,Password FROM user;
    +------+-----------------------+----------+
    | User | Host                  | Password |
    +------+-----------------------+----------+
    | root | localhost             |          |
    | root | localhost.localdomain |          |
    | root | 127.0.0.1             |          |
    | root | ::1                   |          |
    |      | localhost             |          |
    |      | localhost.localdomain |          |
    +------+-----------------------+----------+
    6 rows in set (0.00 sec)

    設置安全初始化程序,禁止管理員禁止登陸,清空匿名用戶,設置管理員的密碼

    [root@localhost mysql]# /usr/local/mysql/bin/mysql_secure_installation

    Enter current password for root (enter for none):
    OK, successfully used password, moving on...

    Setting the root password ensures that nobody can log into the MariaDB
    root user without the proper authorisation.

    Set root password? [Y/n] Y
    New password:
    Re-enter new password:
    Password updated successfully!
    Reloading privilege tables..
     ... Success!


    By default, a MariaDB installation has an anonymous user, allowing anyone
    to log into MariaDB without having to have a user account created for
    them.  This is intended only for testing, and to make the installation
    go a bit smoother.  You should remove them before moving into a
    production environment.

    Remove anonymous users? [Y/n] Y
     ... Success!

    Normally, root should only be allowed to connect from 'localhost'.  This
    ensures that someone cannot guess at the root password from the network.

    Disallow root login remotely? [Y/n] Y
     ... Success!

    By default, MariaDB comes with a database named 'test' that anyone can
    access.  This is also intended only for testing, and should be removed
    before moving into a production environment.

    Remove test database and access to it? [Y/n] Y
     - Dropping test database...
     ... Success!
     - Removing privileges on test database...
     ... Success!

    Reloading the privilege tables will ensure that all changes made so far
    will take effect immediately.

    Reload privilege tables now? [Y/n] Y
     ... Success!

    Cleaning up...

    All done!  If you've completed all of the above steps, your MariaDB
    installation should now be secure.

    Thanks for using MariaDB!

    此時你用root登錄,會發現已經不能直接登錄了

    [root@localhost mysql]# mysql
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    可用這種方式登錄

    [root@localhost mysql]# mysql -uroot -p
    mysql> use mysql;
    mysql> SELECT User,Host,Password FROM user;
    +------+-----------+-------------------------------------------+
    | User | Host      | Password                                  |
    +------+-----------+-------------------------------------------+
    | root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    | root | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    | root | ::1       | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    +------+-----------+-------------------------------------------+
    3 rows in set (0.00 sec)

    mysql> status
    --------------
    mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1

    Connection id:        18
    Current database:    mysql
    Current user:        root@localhost
    SSL:            Not in use
    Current pager:        stdout
    Using outfile:        ''
    Using delimiter:    ;
    Server version:        5.5.43-MariaDB-log MariaDB Server
    Protocol version:    10
    Connection:        Localhost via UNIX socket
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    latin1
    Conn.  characterset:    latin1
    UNIX socket:        /tmp/mysql.sock
    Uptime:            20 min 35 sec

    Threads: 1  Questions: 38  Slow queries: 0  Opens: 1  Flush tables: 2  Open tables: 27  Queries per second avg: 0.030
    --------------

    查看命令的相關幫助文檔

    mysql> HELP CREATE DATABASE;

    mysql> SHOW ENGINES;

    mysql> CREATE DATABASE IF NOT EXISTS testdb;

    mysql> use testdb;

    mysql> CREATE TABLE tb1(id int NOT NULL,name VARCHAR(100) NOT NULL,age tinyint);

    mysql> SHOW TABLES;
    +------------------+
    | Tables_in_testdb |
    +------------------+
    | tb1              |
    +------------------+
    1 row in set (0.00 sec)

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | testdb             |
    +--------------------+
    4 rows in set (0.00 sec)

    mysql> DESC tb1;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id    | int(11)      | NO   |     | NULL    |       |
    | name  | varchar(100) | NO   |     | NULL    |       |
    | age   | tinyint(4)   | YES  |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    3 rows in set (0.02 sec)

9.mysql的基礎命令

    登錄進mysql

    [root@localhost mysql]# mysql -uroot -predhat

    mysql> CREATE DATABASE testdb;

    mysql> CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED);

    mysql> DESC students;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | id    | int(10) unsigned    | NO   | PRI | NULL    |       |
    | name  | varchar(20)         | NO   |     | NULL    |       |
    | age   | tinyint(3) unsigned | YES  |     | NULL    |       |
    +-------+---------------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)

    或者是單獨定義修飾符表示的內容,即定義聯合式的主鍵

    mysql> CREATE TABLE tbl2 (id int UNSIGNED NOT NULL,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));

    這裏只要是id,name這兩個鍵的聯合內容不相同即可。

    mysql> SHOW TABLE STATUS LIKE 'students'\G;
    *************************** 1. row ***************************
               Name: students
             Engine: InnoDB
            Version: 10
         Row_format: Compact
               Rows: 0
     Avg_row_length: 0
        Data_length: 16384
    Max_data_length: 0
       Index_length: 0
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2015-10-11 04:33:41
        Update_time: NULL
         Check_time: NULL
          Collation: latin1_swedish_ci
           Checksum: NULL
     Create_options:
            Comment:
    1 row in set (0.00 sec)

    ERROR:
    No query specified

    \G的含義是豎排顯示

    在幫助手冊中查看ALTER, CHANGE, MODIFY這三個命令的不同

    添加字段

    mysql> ALTER TABLE students ADD gender ENUM('m','f');

    當修改字段名稱時,對剩下的要有定義

    mysql> ALTER TABLE students CHANGE id sid int UNSIGNED NOT NULL;

    mysql> DESC students;
    +--------+---------------------+------+-----+---------+-------+
    | Field  | Type                | Null | Key | Default | Extra |
    +--------+---------------------+------+-----+---------+-------+
    | sid    | int(10) unsigned    | NO   | PRI | NULL    |       |
    | name   | varchar(20)         | NO   |     | NULL    |       |
    | age    | tinyint(3) unsigned | YES  |     | NULL    |       |
    | gender | enum('m','f')       | YES  |     | NULL    |       |
    +--------+---------------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)

    修改惟一鍵

    mysql> ALTER TABLE students ADD UNIQUE KEY(name);

    mysql> DESC students;
    +--------+---------------------+------+-----+---------+-------+
    | Field  | Type                | Null | Key | Default | Extra |
    +--------+---------------------+------+-----+---------+-------+
    | sid    | int(10) unsigned    | NO   | PRI | NULL    |       |
    | name   | varchar(20)         | NO   | UNI | NULL    |       |
    | age    | tinyint(3) unsigned | YES  |     | NULL    |       |
    | gender | enum('m','f')       | YES  |     | NULL    |       |
    +--------+---------------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)

    添加索引

    mysql> SHOW INDEXES FROM students\G;
    *************************** 1. row ***************************
            Table: students
       Non_unique: 0
         Key_name: PRIMARY
     Seq_in_index: 1
      Column_name: sid
        Collation: A
      Cardinality: 0
         Sub_part: NULL
           Packed: NULL
             Null:
       Index_type: BTREE
          Comment:
    Index_comment:
    *************************** 2. row ***************************
            Table: students
       Non_unique: 0
         Key_name: name
     Seq_in_index: 1
      Column_name: name
        Collation: A
      Cardinality: 0
         Sub_part: NULL
           Packed: NULL
             Null:
       Index_type: BTREE
          Comment:
    Index_comment:
    2 rows in set (0.02 sec)

    刪除索引

    mysql> ALTER TABLE students DROP age;

    mysql> SHOW INDEXES FROM students\G;

    mysql> DROP INDEX name ON students;

DML:

    mysql> INSERT INTO students VALUES (1,'YangGuo','m');

    mysql> SELECT * FROM students;
    +-----+---------+--------+
    | sid | name    | gender |
    +-----+---------+--------+
    |   1 | YangGuo | m      |
    +-----+---------+--------+
    1 row in set (0.00 sec)

    mysql> INSERT INTO students (sid,name) VALUES (3,'ZhangWuji'),(4,'ZhaoMin');

    mysql> SELECT * FROM students;
    +-----+-----------+--------+
    | sid | name      | gender |
    +-----+-----------+--------+
    |   1 | YangGuo   | m      |
    |   3 | ZhangWuji | NULL   |
    |   4 | ZhaoMin   | NULL   |
    +-----+-----------+--------+
    3 rows in set (0.00 sec)

    查看創建命令的幫助信息

    mysql> HELP DELETE;
    Name: 'DELETE'
    Description:
    Syntax:
    Single-table syntax:

    DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
        [WHERE where_condition]
        [ORDER BY ...]
        [LIMIT row_count]

    Multiple-table syntax:

    DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
        tbl_name[.*] [, tbl_name[.*]] ...
        FROM table_references
        [WHERE where_condition]

    Or:

    DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
        FROM tbl_name[.*] [, tbl_name[.*]] ...
        USING table_references
        [WHERE where_condition]

    mysql> HELP SELECT;
    Name: 'SELECT'
    Description:
    Syntax:
    SELECT
        [ALL | DISTINCT | DISTINCTROW ]
          [HIGH_PRIORITY]
          [STRAIGHT_JOIN]
          [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
          [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
        select_expr [, select_expr ...]
        [FROM table_references
        [WHERE where_condition]
        [GROUP BY {col_name | expr | position}
          [ASC | DESC], ... [WITH ROLLUP]]
        [HAVING where_condition]
        [ORDER BY {col_name | expr | position}
          [ASC | DESC], ...]
        [LIMIT {[offset,] row_count | row_count OFFSET offset}]
        [PROCEDURE procedure_name(argument_list)]
        [INTO OUTFILE 'file_name'
            [CHARACTER SET charset_name]
            export_options
          | INTO DUMPFILE 'file_name'
          | INTO var_name [, var_name]]
        [FOR UPDATE | LOCK IN SHARE MODE]]

    mysql> SELECT * FROM students WHERE gender='m';
    +-----+---------+--------+
    | sid | name    | gender |
    +-----+---------+--------+
    |   1 | YangGuo | m      |
    +-----+---------+--------+
    1 row in set (0.00 sec)

    mysql> SELECT * FROM students WHERE gender IS NULL;
    +-----+-----------+--------+
    | sid | name      | gender |
    +-----+-----------+--------+
    |   3 | ZhangWuji | NULL   |
    |   4 | ZhaoMin   | NULL   |
    +-----+-----------+--------+
    2 rows in set (0.00 sec)

    mysql> SELECT * FROM students ORDER BY name DESC LIMIT 1,2;
    +-----+-----------+--------+
    | sid | name      | gender |
    +-----+-----------+--------+
    |   3 | ZhangWuji | NULL   |
    |   1 | YangGuo   | m      |
    +-----+-----------+--------+
    2 rows in set (0.01 sec)

    mysql> SELECT * FROM students WHERE sid>=2 AND sid<=4;
    +-----+-----------+--------+
    | sid | name      | gender |
    +-----+-----------+--------+
    |   3 | ZhangWuji | NULL   |
    |   4 | ZhaoMin   | NULL   |
    +-----+-----------+--------+
    2 rows in set (0.00 sec)

    mysql> SELECT * FROM students WHERE sid BETWEEN 2 AND 4;
    +-----+-----------+--------+
    | sid | name      | gender |
    +-----+-----------+--------+
    |   3 | ZhangWuji | NULL   |
    |   4 | ZhaoMin   | NULL   |
    +-----+-----------+--------+
    2 rows in set (0.00 sec)

    mysql> SELECT * FROM students WHERE name LIKE 'z%';
    +-----+-----------+--------+
    | sid | name      | gender |
    +-----+-----------+--------+
    |   3 | ZhangWuji | NULL   |
    |   4 | ZhaoMin   | NULL   |
    +-----+-----------+--------+
    2 rows in set (0.00 sec)

    mysql> SELECT * FROM students WHERE name RLIKE '.*[A-G]u.*';
    +-----+---------+--------+
    | sid | name    | gender |
    +-----+---------+--------+
    |   1 | YangGuo | m      |
    +-----+---------+--------+
    1 row in set (0.00 sec)

    mysql> SELECT sid as stuid,name as stuname FROM students;
    +-------+-----------+
    | stuid | stuname   |
    +-------+-----------+
    |     1 | YangGuo   |
    |     3 | ZhangWuji |
    |     4 | ZhaoMin   |
    +-------+-----------+
    3 rows in set (0.00 sec)

    mysql> HELP UPDATE
    Name: 'UPDATE'
    Description:
    Syntax:
    Single-table syntax:

    UPDATE [LOW_PRIORITY] [IGNORE] table_reference
        SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
        [WHERE where_condition]
        [ORDER BY ...]
        [LIMIT row_count]

創建用戶
    mysql> CREATE USER 'wpuser'@'%' IDENTIFIED BY 'wppasswd';

    mysql> use mysql;

    查看存儲用戶的信息表

    mysql> SELECT User,Host,Password FROM user;
    +--------+-----------+-------------------------------------------+
    | User   | Host      | Password                                  |
    +--------+-----------+-------------------------------------------+
    | root   | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    | root   | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    | root   | ::1       | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
    | wpuser | %         | *7CD61EFBFDDDBD978EA9017F2A26A59DE4589025 |
    +--------+-----------+-------------------------------------------+
    4 rows in set (0.01 sec)

    這樣任意主機,就可以通過wpuser進入mysql

    我們通過192.168.1.110連接本機的mysql

    [root@localhost ~]# mysql -uwpuser -h192.168.1.109 -p

    注意:如果連接不上,注意查看一下防火牆

    MariaDB [(none)]> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    +--------------------+
    1 row in set (0.04 sec)

    MariaDB [(none)]> HELP GRANT;
    Name: 'GRANT'
    Description:
    Syntax:
    GRANT
        priv_type [(column_list)]
          [, priv_type [(column_list)]] ...
        ON [object_type] priv_level
        TO user_specification [, user_specification] ...
        [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
        [WITH with_option ...]

    GRANT PROXY ON user_specification
        TO user_specification [, user_specification] ...
        [WITH GRANT OPTION]

    object_type:
        TABLE
      | FUNCTION
      | PROCEDURE

    priv_level:
        *
      | *.*
      | db_name.*
      | db_name.tbl_name
      | tbl_name
      | db_name.routine_name

    user_specification:
        user
        [
            IDENTIFIED BY [PASSWORD] 'password'
          | IDENTIFIED WITH auth_plugin [AS 'auth_string']
        ]

    ssl_option:
        SSL
      | X509
      | CIPHER 'cipher'
      | ISSUER 'issuer'
      | SUBJECT 'subject'

    with_option:
        GRANT OPTION
      | MAX_QUERIES_PER_HOUR count
      | MAX_UPDATES_PER_HOUR count
      | MAX_CONNECTIONS_PER_HOUR count
      | MAX_USER_CONNECTIONS count

      MariaDB [(none)]> HELP SHOW GRANTS;
    Name: 'SHOW GRANTS'
    Description:
    Syntax:
    SHOW GRANTS [FOR user]

    MariaDB [(none)]> SHOW GRANTS FOR 'wpuser'@'%';
    +-------------------------------------------------------------------------------------------------------+
    | Grants for wpuser@%                                                                                   |
    +-------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'wpuser'@'%' IDENTIFIED BY PASSWORD '*7CD61EFBFDDDBD978EA9017F2A26A59DE4589025' |
    +-------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

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

    mysql> SHOW GRANTS FOR CURRENT_USER;

    mysql> GRANT SELECT,DELETE ON testdb.* TO 'testdb'@'%' IDENTIFIED BY 'testpass';

    以192.168.1.110訪問數據庫

    [root@localhost ~]# mysql -utestdb -h192.168.1.109 -p

    MariaDB [(none)]> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | testdb             |
    +--------------------+
    2 rows in set (0.00 sec)

    MariaDB [(none)]> use testdb;

    MariaDB [testdb]> SHOW GRANTS FOR CURRENT_USER;
    +-------------------------------------------------------------------------------------------------------+
    | Grants for testdb@%                                                                                   |
    +-------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'testdb'@'%' IDENTIFIED BY PASSWORD '*00E247AC5F9AF26AE0194B41E1E769DEE1429A29' |
    | GRANT SELECT, DELETE ON `testdb`.* TO 'testdb'@'%'                                                    |
    +-------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    MariaDB [testdb]> CREATE TABLE tbl2(id int);
    ERROR 1142 (42000): CREATE command denied to user 'testdb'@'192.168.1.110' for table 'tbl2'

    此時會發現,因爲我們之前設定的原因,當前用戶沒有權限創建表

    MariaDB [testdb]> DELETE FROM students WHERE sid=4;
    Query OK, 1 row affected (0.01 sec)

    回收權限

    MariaDB [testdb]> REVOKE DELETE ON testdb.* FROM 'testdb'@'%';
    ERROR 1044 (42000): Access denied for user 'testdb'@'%' to database 'testdb'

    發現自己沒有權限回收權限,只有以管理員的權限纔可以


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