天天看點

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 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;

檢視表的字段描述

檢視庫中的所有表

show tables

删除表

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

    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

    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

    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...

     - Removing privileges on test database...

    Reloading the privilege tables will ensure that all changes made so far

    will take effect immediately.

    Reload privilege tables now? [Y/n] Y

    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登入,會發現已經不能直接登入了

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

    可用這種方式登入

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

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

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

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

    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:

    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;

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

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

    | name   | varchar(20)         | NO   | UNI | NULL    |       |

    添加索引

    mysql> SHOW INDEXES FROM students\G;

            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 ***************************

         Key_name: name

      Column_name: name

    2 rows in set (0.02 sec)

    删除索引

    mysql> ALTER TABLE students DROP age;

    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      |

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

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

    | sid | name      | gender |

    |   1 | YangGuo   | m      |

    |   3 | ZhangWuji | NULL   |

    |   4 | ZhaoMin   | NULL   |

    檢視建立指令的幫助資訊

    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

    Or:

        FROM tbl_name[.*] [, tbl_name[.*]] ...

        USING table_references

    mysql> HELP SELECT;

    Name: 'SELECT'

    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

        [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';

    mysql> SELECT * FROM students WHERE gender IS NULL;

    2 rows in set (0.00 sec)

    mysql> SELECT * FROM students ORDER BY name DESC LIMIT 1,2;

    2 rows in set (0.01 sec)

    mysql> SELECT * FROM students WHERE sid>=2 AND sid<=4;

    mysql> SELECT * FROM students WHERE sid BETWEEN 2 AND 4;

    mysql> SELECT * FROM students WHERE name LIKE 'z%';

    mysql> SELECT * FROM students WHERE name RLIKE '.*[A-G]u.*';

    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'

    UPDATE [LOW_PRIORITY] [IGNORE] table_reference

        SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

建立使用者

    mysql> CREATE USER 'wpuser'@'%' IDENTIFIED BY 'wppasswd';

    檢視存儲使用者的資訊表

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

    | User   | Host      | Password                                  |

    | root   | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |

    | root   | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |

    | root   | ::1       | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |

    | wpuser | %         | *7CD61EFBFDDDBD978EA9017F2A26A59DE4589025 |

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

    我們通過192.168.1.110連接配接本機的mysql

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

    注意:如果連接配接不上,注意檢視一下防火牆

    MariaDB [(none)]> SHOW DATABASES;

    1 row in set (0.04 sec)

    MariaDB [(none)]> HELP GRANT;

    Name: 'GRANT'

    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

        [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'

    SHOW GRANTS [FOR user]

    MariaDB [(none)]> SHOW GRANTS FOR 'wpuser'@'%';

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

    | Grants for wpuser@%                                                                                   |

    | GRANT USAGE ON *.* TO 'wpuser'@'%' IDENTIFIED BY PASSWORD '*7CD61EFBFDDDBD978EA9017F2A26A59DE4589025' |

    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)]> 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'@'%'                                                    |

    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'

上一篇: mariaDB
下一篇: mariadb

繼續閱讀