DBMS出现之前数据管理的缺陷:

  1. 数据冗余:同样数据出现多次,冗余量太大

  2. 数据不一致性:不在同一位置的相同文件需要逐个修改

  3. 数据访问困难:没有强大的索引很难检索到所需要的数据

  4. 数据孤立性:数据定义的格式没有规范,不方便分类访问

  5. 完整性问题:多用户同时修改数据时,数据完整性得不到保障

  6. 原子性问题:操作数据后,数据的状态必须从一个稳定的状态转换到另一个稳定的状态

  7. 并发访问异常:多用户同时访问同一数据,文件有锁机制,无法并发

  8. 安全性问题:无法对用户实现文件部分授权


关系型数据库设计至少遵循三个范式:

1.每个表中的任何一列的每一个字段都是原子性的。

2.每个表应该有一个主键(有限个字段)标示此行的唯一性(每一行数据都是唯一的)。避免冗余

3.多个表之间依照主键建立起依赖关系(一个表的外键关联于另一个表的主键),实现将一个大表拆成多个小表,此时用到跨表查询,需要连接两张表进行查询}


关系型数据库基本概念:

约束:constraint,向数据表提供的数据要遵守的限制;
主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL;一个表只能存在一个
惟一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL;一个表可以存在多个
外键:一个表中的某字段可填入数据取决于另一个表的主键已有的数据;
检查性约束(check):定义表达式检测数据是否合规,mysql尚不支持

关系型数据库的常见组件:

数据库:database        
表:table        
行:row        
列:column
索引:将表中的一个或者多个字段中的数据复制一份另存,并且此些需要按照特定次序排序存储。index 可以加速查询,影响写入操作
视图:view虚表,一个select语句得到的结果保存为虚表,可以对这个虚表继续执行查询操作
用户:user        
权限:privilege        
存储过程:procedure   无返回值        
存储函数:function   有返回值        
触发器:trigger  监视器发现某数据改变了可以触发执行一段代码        
事件调度器:event scheduler  类似于linux下crontab

支持面向过程编程:支持选择,循环


关系运算:

        选择:挑选符合条件的行,单表查询时用到

        投影:挑选符合条件的字段(列),单表查询时用到

        自然连接:具有相同名字的属性上所有取值相同的行;多表查询时用到

        笛卡尔积:(a+b)*(c+d)=ac+ad+bc+bd多表查询时用到

        并集合运算多表查询时用到


安装和使用MariaDB
    CentOS 7直接提供;
    下面介绍CentOS 6通用二进制格式安装过程
    (1) 准备数据目录
        以/mydata/data为例;

mysql基础_mysql

创建LVM使数据库使用磁盘具有扩展性:

mysql基础_mariadb_02

加载xfs文件系统

mysql基础_mariadb_03

创建xfs文件系统

mysql基础_mariadb_04

开机自动挂载

mysql基础_mysql_05

设置数据库使用磁盘属性:

mysql基础_mariadb_06

    (2) 配置mariadb
    # groupadd -r -g 306 mysql
    # useradd -r -g 306 -u 306 mysql
    # tar xf mariadb-VERSION.tar.xz -C /usr/local
    # ln -sv
    # cd /usr/local/mysql
    # chown -R root:mysql ./*
    # scripts/mysql_install_db --datadir=/mydata/data --user=mysql

mysql基础_mysql_07

运行安装脚本:

mysql基础_mariadb_08

    # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
    # chkconfig --add mysqld

mysql基础_mysql_09
    (3) 准备配置文件
    配置格式:类ini格式,为各程序均通过单个配置文件提供配置信息;
        [prog_name]
    配置文件查找次序:
     /etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE指令指明的路径 --> ~/.my.cnf  优先级次序由后向前
        # mkdir /etc/mysql
        # cp support-files/my-large.cnf /etc/mysql/my.cnf

编辑my.cnf文件

    添加三个选项:
        datadir = /mydata/data  #指定数据存放目录
        innodb_file_per_table = on  #开启innodb
        skip_name_resolve = on  #只根据ip做授权,不反解主机名

mysql基础_mysql_10

启动mysqld并查看发现运行的是mysqld_safe

mysql基础_mysql_11

安装后的设定:
(1) 为所有root用户设定密码;
    mysql> SET PASSWORD
    mysql> update mysql.user root SET password=PASSWORD('your_pass') WHERE cluase;需要重读授权表
    # mysqlamin
修改用户密码的几种方式:
1.mysqladmin -uroot password  ’new-password’ -p    
2.mysqladmin -uroot -h this_host_name password ’new-password’
3.mysql>SET PASSWORD FOR ’root’@’host_name’ =PASSWORD(’new_password’);
4.mysql>UPDATE mysql.user SET Password = PASSWORD(’new_password’) WHERE User = ’root’ and Host=‘mysql.a.org’;
  mysql>FLUSH PRIVILEGES;
(2) 删除所有匿名用户
    mysql> DROP USER ''@'localhost';
    上述两步骤可运行命令:mysql_secure_installation
(3) 建议关闭主机名反解功能;

初始化脚本:

mysql基础_mysql_12

centos6编译安装MariaDB

准备编译环境:
yum install cmake
yum groupinstall "Development Tools" "Server Platform Development"
创建用户:
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 mysql
mkdir /data/mydata
tar xf mariadb-5.5.44.tar.gz
cd mariadb-5.5.44
准备数据目录:
准备一个新分区作lvm提供数据存储:
[root@testserver ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 
Value out of range.
Partition number (1-4): 3
First cylinder (7859-15665, default 7859): 
Using default value 7859
Last cylinder, +cylinders or +size{K,M,G} (7859-15665, default 15665): +20G

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!
做LVM:
[root@testserver ~]# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
[root@testserver ~]# pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created
[root@testserver ~]# vgcreate myvg /dev/sda3
  Volume group "myvg" successfully created
[root@testserver ~]# lvcreate -L 10G -n mydata myvg
  Logical volume "mydata" created
[root@testserver ~]# lvs
  LV     VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mydata myvg -wi-a----- 10.00g                                                    
  root   vg0  -wi-ao---- 20.00g                                                    
  swap   vg0  -wi-ao----  2.00g                                                    
  usr    vg0  -wi-ao---- 10.00g                                                    
  var    vg0  -wi-ao---- 20.00g
格式化:
mke2fs -t ext4 /dev/myvg/mydata    
开机自动挂载:
mkdir /mydata/
在fstab文件中添加/dev/myvg/mydata        /mydata                 ext4    defaults        0 0
mount -a
mkdir /mydata/data
chown mysql.mysql /mydata/data/ -R
执行cmake:
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
          -DMYSQL_DATADIR=/mydata/data \
          -DSYSCONFDIR=/etc \
          -DWITH_INNOBASE_STORAGE_ENGINE=1 \
          -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
          -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
          -DWITH_READLINE=1 \
          -DWITH_SSL=system \
          -DWITH_ZLIB=system \
          -DWITH_LIBWRAP=0 \
          -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
          -DDEFAULT_CHARSET=utf8 \
          -DDEFAULT_COLLATION=utf8_general_ci
make
make indtall
chown -R root.mysql ./*
ln -sv mariadb-5.5.44 mysql
cd mysql
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/mydata/data/
[root@testserver mariadb-5.5.44]# mkdir /etc/mysql
[root@testserver mariadb-5.5.44]# cp support-files/my-large.cnf /etc/mysql/my.cnf
编辑my.cnf:在mysqld段加如下内容
datadir=/mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
[root@testserver mariadb-5.5.44]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@testserver mariadb-5.5.44]# service mysqld start
env: /etc/init.d/mysqld: Permission denied
[root@testserver mariadb-5.5.44]# chmod +x /etc/rc.d/init.d/mysqld 
[root@testserver mariadb-5.5.44]# chkconfig --add mysqld
[root@testserver mariadb-5.5.44]# service mysqld start
Starting MySQL....                                         [  OK  ]
运行初始化安全脚本:
/usr/local/mysql/bin/mysql_secure_installation
在.bash_profile中添加:
PATH=/usr/local/mysql/bin:$PATH:$HOME/bin
export PATH
运行客户端登录:
[root@testserver ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.44-MariaDB-log Source distribution

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
完成

MariaDB的程序组成:  

mysql --> mysqld
客户端程序:
    mysql: 交互式的CLI工具;
    mysqldump: 备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中;
    mysqladmin:基于mysql协议管理mysqld;
    mysqlimport: 数据导入工具;
非客户端类的管理工具:只能工作在mysqld安装的主机上,不能远程管理
    myisamchk, myisampack
如何获取程序默认使用的配置:
    mysql --print-defaults
    mysqld --print-defaults
客户端类应用程序的可用选项:
    -u, --user=  用户
    -h, --host=  主机
    -p, --passowrd=  密码
    -P, --port=  端口
    --protocol=  协议 
    -S, --socket=  裸套接字文件位置,客户端和服务器端在同一主机时用socket不在同一主机使用3306端口
    -D, --database=  数据库
    -C, --compress   连接服务器端时是否压缩传输中的数据
mysql -e "SQL"  不连入mysqld,只是执行一个mysql语句
[root@node1 ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
交互式模式:
  可运行命令有两类:
    客户端命令:\h, help \s,status
    服务器端命令:SQL, 需要语句结束符;
脚本模式导入数据库:
    mysql -uUSERNAME -hHOST -pPASSWORD < /path/from/somefile.sql
mysql交互式模式下导入数据库:
    mysql> source /path/from/somefile.sql

服务器端(mysqld,mysqld_safe,mysqld_multi):工作特性有多种定义方式
    命令行选项
    配置文件参数    
获取可用参数列表:
    mysqld --help --verbose
获取运行中的mysql进程使用各服务器参数及其值:
    mysql> SHOW GLOBAL VARIABLES; 全局有效,但对当前不生效
    mysql> SHOW [SESSION] VARIABLES;对当前会话连接线程有效
注意:其中有些参数支持运行时修改,会立即生效;有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效;
有些参数作用域是全局的,且不可改变;有些可以为每个用户提供单独的设置;
修改服务器变量的值:
    mysql> help SET
  全局级别(全局有效):
    mysql> SET GLOBAL system_var_name=value;
    mysql> SET @@global.system_var_name=value;
  会话级别(当前会话有效):
    mysql> SET [SESSION] system_var_name=value;
    mysql> SET @@[session.]system_var_name=value;
  状态变量:用于保存mysqld运行中的统计数据的变量;
    mysql> SHOW GLOBAL STATUS;
    mysql> SHOW [SESSION] STATUS;

SQL MODE:定义mysqld对约束等的响应行为;
        修改方式:
            mysql> SET GLOBAL sql_mode='MODE';
            mysql> SET @@global.sql_mode='MODE';
            需要修改权限;仅对修改后新创建的会话有效;对已经建立的会话无效;
            mysql> SET SESSION sql_mode='MODE';
            mysql> SET @@session.sql_mode='MODE';
        常用MODE:
TRADITIONAL:不允许对非法值做插入操作,
STRICT_TRANS_TABLES:对所有支持事物类型的表做严格约束, 
STRICT_ALL_TABLES:对所有表做严格约束。
示例:
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'sql_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+
1 row in set (0.00 sec)
创建一个表
MariaDB [mydb]> CREATE TABLE t1 (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, name CHAR(5) NOT NULL);
插入数据:(故意插入一个较长的数据,大小大于CHAR(5),会出现warning,并且插入的数据不完整)
MariaDB [mydb]> INSERT INTO t1 (name) VALUES ('tom'),('BlackBerry');
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 1

MariaDB [mydb]> SHOW WARNINGS;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 2 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
MariaDB [mydb]> SELECT * FROM t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | tom   |
|  2 | Blake |
+----+-------+
2 rows in set (0.00 sec)
改变mode为TRADITIONAL再插入:发现无法插入并提示插入数据太长
MariaDB [mydb]> INSERT INTO t1 (name) VALUES ('WhiteBerry');
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql服务器监听的两种socket地址:
ip socket: 监听在tcp的3306端口,支持远程通信;
unix sock: 监听在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),仅支持本地通信

查看系统信息:
MariaDB [mysql]> status
--------------
mysql Ver 15.1 Distrib 5.5.41-MariaDB, for Linux (x86_64) using readline 5.1
 
Connection id:          2
Current database:   mysql
Current user:            root@localhost
SSL:                     Notin use
Current pager:                   stdout
Using outfile:            ''
Using delimiter:       ;
Server:                        MariaDB
Server version:                   5.5.41-MariaDB MariaDB Server
Protocol version:      10
Connection:               Localhostvia UNIX socket
Server characterset:        latin1
Db    characterset:    latin1
Client characterset:         utf8
Conn. characterset:     utf8
UNIX socket:             /var/lib/mysql/mysql.sock
Uptime:                      2min 24 sec
 
Threads: 1  Questions: 34 Slow queries: 0  Opens: 15  Flush tables: 2  Open tables: 41  Queries per second avg: 0.236

#使用help获取帮助
MariaDB [mysql]> HELP CREATE DATABASE;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS]db_name
   [create_specification] ...
 
create_specification:
   [DEFAULT] CHARACTER SET [=] charset_name
  |[DEFAULT] COLLATE [=] collation_name
 
CREATE DATABASE creates a database with thegiven name. To use this
statement, you need the CREATE privilegefor the database. CREATE
SCHEMA is a synonym for CREATE DATABASE.
 
URL: http://dev.mysql.com/doc/refman/5.5/en/create-database.html
 
#查看存储引擎
MariaDB [mysql]> SHOW ENGINES\G;
*************************** 1. row***************************
     Engine: InnoDB
     Support: DEFAULT
    Comment: Percona-XtraDB, Supports transactions, row-level locking, andforeign keys
Transactions: YES
         XA: YES
 Savepoints: YES
*************************** 2. row***************************
     Engine: CSV
    Support: YES
    Comment: CSV storage engine
Transactions: NO
         XA: NO
 Savepoints: NO
*************************** 3. row***************************
     Engine: MRG_MYISAM
    Support: YES
    Comment: Collection of identical MyISAM tables
Transactions: NO
         XA: NO
 Savepoints: NO
*************************** 4. row***************************
     Engine: BLACKHOLE
    Support: YES
    Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
         XA: NO
 Savepoints: NO
*************************** 5. row***************************
     Engine: MEMORY
    Support: YES
    Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
         XA: NO
 Savepoints: NO
*************************** 6. row***************************
     Engine: PERFORMANCE_SCHEMA
    Support: YES
    Comment: Performance Schema
Transactions: NO
         XA: NO
 Savepoints: NO
*************************** 7. row***************************
     Engine: ARCHIVE
    Support: YES
    Comment: Archive storage engine
Transactions: NO
         XA: NO
 Savepoints: NO
*************************** 8. row***************************
     Engine: MyISAM
    Support: YES
    Comment: MyISAM storage engine
Transactions: NO
         XA: NO
 Savepoints: NO
*************************** 9. row***************************
     Engine: FEDERATED
    Support: YES
    Comment: FederatedX pluggable storage engine
Transactions: YES
         XA: NO
 Savepoints: YES
*************************** 10. row***************************
     Engine: Aria
    Support: YES
    Comment: Crash-safe tables with MyISAM heritage
Transactions: NO
         XA: NO
 Savepoints: NO
10 rows in set (0.00 sec)
 
ERROR: No query specified

MariaDB [hellodb]> show processlist;
+----+------+-----------+---------+---------+------+-------+------------------+----------+
| Id | User | Host      | db      | Command | Time | State | Info             | Progress |
+----+------+-----------+---------+---------+------+-------+------------------+----------+
|  2 | root | localhost | hellodb | Sleep   | 3887 |       | NULL             |    0.000 |
|  3 | root | localhost | hellodb | Query   |    0 | NULL  | show processlist |    0.000 |
+----+------+-----------+---------+---------+------+-------+------------------+----------+
2 rows in set (0.00 sec)
#使用某个数据库
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
#查看user表中的User,Host,Password三段内容
MariaDB [mysql]> SELECT User,Host,Password FROM user;
+--------+-----------------------+-------------------------------------------+
| User   | Host                  | Password                                  |
+--------+-----------------------+-------------------------------------------+
| root   | localhost             | *886308E9B2704A1DDD9D01897AE483DDCA88A218 |
| root   | localhost.localdomain |                                           |
| root   | 127.0.0.1             | *886308E9B2704A1DDD9D01897AE483DDCA88A218 |
| root   | ::1                   |                                           |
|        | localhost             | #发现有两个匿名用户,为了安全应删除                                          |
|        | localhost.localdomain |                                           |
| wpuser | %                     | *FCE7BD77D7A85E580808A8B117943CB7DFE021FB |
+--------+-----------------------+-------------------------------------------+
7 rows in set (0.00 sec)

GRANT命令创建远程连接mysql授权用户test
mysql -u root -p
mysql>GRANT ALL PRIVILEGES ON *.* TO test@localhost IDENTIFIED BY 'test' WITH GRANT OPTION;
mysql>GRANT ALL PRIVILEGES ON *.* TO test@"%" IDENTIFIED BY 'test' WITH GRANT OPTION;