美文网首页
mysql基础

mysql基础

作者: 杜崇铭 | 来源:发表于2018-08-04 08:39 被阅读0次

    Mysql 5.7之后都会有默认的root密码:通过grep "temporary password" /var/log/mysqld.log来找回

    文件存储的劣势

        数据冗余的不一致性性

        数据访问困难

        数据孤立

        完整性问题

        原子性问题

        并发访问异常

        安全性问题

    DML:数据操作语言

        INSERT

        DELETE

        SELECT

        UPDATE

    DDL:数据定义语言

        CREATE

        DROP

        ALTER

    DCL:数据控制语言

        GRANT

        REVOKE

    RDB对象:库、表、索引、视图、用户、存储过程、存储函数、时间调度器

    约束

        域约束:数据类型约束

        外键约束:引用完整性约束

        主键约束:某字段能唯一标识此字段所属的实体,且不为空

        唯一性约束:每一行的某字段都不允许出现相同值,可以为空

            一张表中可以有多个

        检查性约束:不能出现违反常理的类型

        constraint

    数据查询和存储

        存储管理器

            权限及完整性管理器

            事务管理器

            文件管理器

            缓冲区管理器

        查询管理器

            dml解释器

            ddl解释器

            dcl解释器

            查询执行引擎

    mysql是单进程多线程的模型

        守护线程

        应用线程

    关系运算

        投影:只输出指定属性

        选择:只输出符合条件的行

        自然连接:具有相同名字的属性上所有取值相同的行

        笛卡尔积:

            (a+b)*(c+d)=ac+ad+bc+bd

        并:两个表关系相同的部分。集合运算

    sql查询语句

        DDL

        DML

        完整性定义语言:ddl的一部分

        视图定义语言

        事务控制语言

        嵌入式sql和动态sql:把sql嵌入到程序语言中叫嵌入式sql;程序设计语言使用函数或者方法和rdbms服务器建立连接并进行交互叫动态sql

        授权:DCL

    使用程序设计语言和rdbms交互:

        嵌入式sql:与动态sql相似但是要编译时完全确定下来

            odbc

        动态sql:直接发送的语句

            jdbc

    mysql的存储引擎是插件式的

    表管理器:负责创建、读取或修改表定义文件;维护表描述符高速缓存;管理表锁

        表结构定义文件

    表修改模块:表创建、删除、重命名、地处、更新或插入之类的操作

    表维护模块:表的检查、修理、备份、恢复、优化(碎片整理)及解析

    文件中记录组织

        堆文件组织:一条记录可以放在文件中任何地方

        顺序文件组织:根据“搜索码”值顺序存放

        散列文件组织:人为的根据哈希值分“桶”

    表空间(table space):一个空间放多个表的空间。

    数据字典(data dictionary):关系的元数据,比如,关系的名字、字段的名字、字段的类型和长度、视图、约束、用户名字、授权、密码

    缓冲区管理器:

        缓冲置换策略

        被钉住的块

    mysql启动装载的文件,每次执行都会装载一次,以最后一个配置文件的配置为准(~/.my.cnf)

        1./etc/my.cnf

        2./etc/nysql/my.cnf

        3.$MYSQL_HOME/my.cnf

    /path/to/file when defaults-extra-file=/path/to/file is specified

        4.~/.my.cnf

    安装完成后会有五个用户

        root

        root@127.0.0.1

        root@localhost

        ''@localhost

        ''@hostname

    mysql用户密码修改

        1.#mysqladmin -u USERNAME -p HOSTNAME password 'NEW_PASS' -p 'OLD_PASS'

        2.mysql>SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('new-pass');

        3.mysql>UPDATE mysql.user SET PASSWORD=PASSWORD('new_pass')WHERE CONDITION;

    mysql客户端工具:

        mysql

        mysqldump

        mysqladmin

        mysqlcheck

        mysqlimport

    mysql非客户端工具

        myisamchk

        myisampack

    两大存储引擎

        MyISAM--->表类型,无事务,表锁

            每个表有三个文件

                .frm:表结构

                .MYD:表数据

                .MYI:表索引

        InnoDB--->事务,行锁

            所有表共享一个表空间文件

            建议:每表用一个单独表空间文件

                .frm:表结构

                .ibd:表空间(表数据索引)

    客户端命令

    \c:提前终止语句执行

    \g:无论语句结束符是什么,直接将此语句发送服务器端执行

    \G:无论语句结束符是什么,直接将此语句发送服务器端执行,以竖排方式显示

    \! COMMAND:执行shell命令

    \w:语句执行结束后显示警告信息

    \#:对新建的对象,支持名称补全功能

    服务器端命令

    mysqladmin

        create DATABASE

        dorp DATABASE

        ping

        processlist

        status

            --sleep N:显示频率

            --count N:显示多个状态

        extended--status:显示状态变量

        variables:显示服务器变量

        flush-privileges:让mysqld重读授权表,等同于reload

        flush-status:重置大多数服务器状态变量

        flush-logs:二进制和中继日志滚动

        flush-hosts:重置主机、账户等计数器

        refresh:相当于同时执行flush-hosts和flush-logs

        shutdown:关闭mysql服务器进程

        start-slave:启动复制,启动从服务器复制进程

            SQL thread

            IO thread

        stop-slave:关闭复制

    数据类型

    数值型

        精确数值

            int

                TINYINT:占用1字节

                SMALLINT:占用2字节

                MEDIUMINT:占用3字节

                INT:占用4字节

                BIGINT:占用8字节

                decimal:1.11之类的精确数值

        近似数值

            float(4 bytes):单精度浮点型

            double(8 bytes):双精度浮点型

            real

    字符型

        定长

            char--->255

            BINARY

        变长

            VARBINARY

            varchar(65535-:+1;65535+:+2)--->65535

            varbinary

            text

                TINYTEXT(多占一个字节)--->255

                TEXT(+2)--->65535

                MEDIUMTEXT(+3)--->16777215

                LONGTEXT(+4)--->4294967295

        TINYBLOB--->255(+1)

        MEDIUMBLOB--->16Mb(+4)

        LONGBLOB--->4Gb(+5)

        BLOB--->64Kb(+3)

    枚举

        ENUM

    集合

        SET

    日期时间型

        date(3 bytes)

        time(3 bytes)

        datetime(8 bytes)

        timestamp(4 bytes)

        year(1 bytes)

    AUTO_INCERMENT

        整形

        非空

        无符号

        主键或唯一键

    MySQL服务器变量

    作用域

        全局变量

            SHOW GLOBAL VARIABLES

        会话变量

            SHOW [SESSION]VARIABLES

    生效时间

        动态

            可即时生效

            生效方式

                全局:对当前会话无效,只对新建会话有效

                会话:即时生效,但只对当前会话有效

        静态

            不需要重启生效,但是重启会失效。可以写在配置文件中,通过参数传递给mysqld

    服务器变量:@@变量名

        显示:select

        设定:set {global|session} 变量名='value'

    连接管理器:

        接受请求

        建立安全连接

        创建线程

        认证用户

    并发控制:

    并发控制依赖的手段

        锁

        时间戳

        多版本和快照隔离

    多版本并发控制:MVCC。每个用户执行的都是一个语句的副本,最后合并副本

    简单的并发控制依靠锁

        锁:

            读锁:共享锁

            写锁:独占锁(排他锁)

                LOCK TABLES tab_name {READ|WRITE};

                UNLOCK TABLES--->解所有锁

        锁粒度:从大到小,MySQL服务器仅支持表级锁,行锁需要由存储引擎完成。越粗糙越容易管理,越精细越容易实现多个操作的并发性(内部实现的就越复杂)

                表锁:锁定数据表

                页锁:锁定一个数据块

                行锁:锁定一行

        事务(状态:活跃、部分提交(最后一句执行中)、失败的、终止的、提交的):

            RDBMS:ACID(原子性,一致性,隔离性,持久性)

                原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

                一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

                隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

                持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

    MyISAM不支持事务,InnoDB支持事务

    事务日志(顺序IO。数据文件是随机IO):

        重做日志

            redo log根据日志重复操作

        撤销日志

            undo log每次操作都保留下来,以保证撤销

    事务隔离(定义了数据库系统中一个操作的结果在何时以何种方式对其他并发操作可见):

        隔离级别:

            READ UNCOMITTED:未提交读,是最低的隔离级别。允许“脏读”(dirty reads),事务可以看到其他事务“尚未提交”的修改。

            READ COMMITTED:提交读级别,基于锁机制并发控制的DBMS需要对选定对象的写锁一直保持到事务结束,但是读锁在SELECT操作完成后马上释放(因此“不可重复读”现象可能会发生,见下面描述)。和前一种隔离级别一样,也不要求“范围锁”。

            REPATEABLE READ:可重复读隔离级别,基于锁机制并发控制的DBMS需要对选定对象的读锁(read locks)和写锁(write locks)一直保持到事务结束,但不要求“范围锁”,因此可能会发生“幻影读”。--->mysql默认

            SERIABLIZABLE:可串行。在基于锁机制并发控制的DBMS实现可串行化,要求在选定对象上的读锁和写锁保持直到事务结束后才能释放。在SELECT 的查询中使用一个“WHERE”子句来描述一个范围时应该获得一个“范围锁”(range-locks)。这种机制可以避免“幻影读”(phantom reads)现象。

    事务调度:

        可恢复调度

        无级联调度

    SQL语句

    数据库:

        CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name [CHARACTER SET=字符集] [COLLATE=排序方式]

        ALTER DATABASE|SCHEMA CHARACTER SET=字符集 COLLATE=排序方式

        DROP DATABASE|SCHEMA db_name

    表:

        1.直接定义一张空表

        2.从其他表中查询出数据,并创建新表

        3.以其他模板创建一个空表

    键也成为约束,可用作索引,属于特殊的索引(有特殊限定):B+TREE的索引结构

    DDL(Data Definition Language):

        CREATE

        ALTER

        DROP

        TRUNCATE

        COMMENT

        RENAME

    创建表:

        CREATE TABLE [IF NOT EXISTS] tb_name(col_name col_definition,constraint)

    创建索引

        CREATE INDEX

        SHOW INDEXS FROM tb_name

    单字段:

        PRIMARY KEY

        UNIQUE KEY

    单或多字段:

        PRAMARY KEY (col,...)

        UNIQUE KEY (col,...)

        INDEX (col,...)

    修改表:

        ALTER TABLE

            添加、删除、修改字段

            添加、删除、修改索引

            修改表名

            修改表属性

    删除表:

        DROP TABLE

    创建索引(索引只能创建和删除,不能被修改,因为索引是表自动维护的数据结构)

        CREATE INDEX index_name ON tb_name(col,...) USING BTREE;

            col_name[(length)] [ASC 升序|DESC 降序]

    删除索引

        DROP INDEX index_name from tb_name;

    DML(Data Manipulation Language):

        SELECT

        INSERT

        UPDATE

        DELETE

        MERGE

        CALL

        EXPLAIN PLAN

        LOCK TABLE

    SELECT select-list FROM tb WHERE qualification

    查询语句类型:

        单表查询

        多表查询

        子查询

    单表查询

    SELECT * FROM tb_name;

    SELECT filed1,filed2 FROM tb_name; 投影

    SELECT [DISTINCT相同的值只显示一次] * FROM tb_name WHERE qualification; 选择

    FROM子句:要查询的关系。表、多个表、其他的SELECT语句

    WHERE子句:布尔关系表达式

    =,>,>=,<,<=

    逻辑关系。与(AND &&)、或(OR ||)、非(NOT !)关系

    ORDER BY field_name{ASC|DESC} 查询后排序

    LIMIT [offset偏移了多少个,]count取多少个

    聚合函数(分组:GROUP BY)

    SUM() 求和

    MIN() 最小

    MAX() 最大

    AVG() 平均值

    COUNT() 个数和

    GROUP BY:分组

    HAVING qualification--->再次过滤

    特殊操作符

    表示之间的值。BETWEEN...AND...

    比较两个值。LIKE ''

    %:任意长度任意字符

    _:任意单个字符

    支持正则表达式。RLIKE ''

    在列表中。IN

    判断是否为空:IS NULL

    判断是否不空:IS NOT NULL

    字段别名:AS

    多表查询

    连接

    交叉连接:笛卡尔乘积

    自然连接:是一种特殊的等值连接,它要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。

    外连接:

    左外连接 ... LEFT JOIN ... ON ...

    右外连接 ... RIGHT JOIN ... ON ...

    自连接:表的数据连接到表自己中的数据

    子查询

    比较操作使用子查询:子查询只能返回单值

    IN()中使用子查询

    FROM中使用子查询

    联合查询

    ... UNION ...

    DELETE:

    DELETE FROM tb_name WHERE condition;

    INSERT INTO:

    INSERT INTO ta_name (col1,col2,...) VALUES (val1,val2,...)[,(val1,val2,...),...]

    字符型:单引号

    数值型:不需要引号

    日期时间型:不需要引号

    空值:NULL

    UPDATE:

    UPDATE tb_name SET col1=...,col2=... WHERE

    视图:存储下来的SELECT语句

    基于基表的查询结果

    创建视图

    CREATE VIEW

    删除视图

    DROP VIEW

    DCL(Data Control Language):

    GRANT

    REVOKE

    GRANT ALL PRIVIEGES ON [object_type] db.* TO username@'%';

    GRANT OPTION(资源使用限定)

    MAX_QUERIES_PER_HOUR count--->每小时最大查询次数

    MAX_UPDATES_PER_HOUR count--->每小时最大更新次数

    MAX_CONNECTIONS_PER_HOUR count--->每小时用户最大连接数

    MAX_USER_CONNECTIONS count--->用户最大连接数

    REVOKE SELECT ON db.* FROM 'username'@'%';

    mysql用户调用查看的六张表

    user:用户帐号、全局权限

    db:库级别权限

    host:已废弃(已经整合到user表)

    tables_priv:表级别权限

    columns_priv:列级别权限

    procs_priv:存储过程和存储函数相关的权限

    proxies_priv:代理用户权限

    用户帐号:

    用户名@主机

    用户名:16字符以内

    主机:

    主机名:www.aaaa.com,mysql

    ip地址:172.16.10.177

    网络地址:172.16.0.0/255.255.0.0

    通配符:172.16.%.%

    --skip-name-resolve:略过正解反解名称

    权限级别:

    全局级别:SUPER

    库:

    表:DELETE,ALTER,TRIGGER

    列:SELECT,INSERT,UPDATE

    存储过程和存储函数

    创建mysql用户:

    CREATE USER username@'%' [IDENTIFIED BY 'password']

    INSERT INTO mysql.user;

    mysql> FLUSH PRIVILEGES;

    删除mysql用户:

    DROP USER 'username'@'host';

    重命名mysql用户

    RENAME USER old_name TO new_name;

    TCL(Transaction Control Language):

    SAVEPOINT

    ROLLBACK

    SET TRANSACTION

    START TANSACTION:启动事务

    COMMIT:提交事务

    ROLLBACK:回滚事务

    如果没有明确启动事务:

    autocommit:能实现自动提交,每一句操作都能直接提交

    select @@autocommit

    SAVEPOINT:保存点

    ROLLBACK TO sid:回滚保存点

    SHOW CREATE:查看创建某个对象的时候使用的语句

    在shell中可以直接使用mysql -e来调用mysql command

    TRUNCATE tb_name:清空表,并重置AUTOINCREMENT计数器;delete语句则会清空表不重置计数器

    忘记mysql密码:

    启动mysqld_safe时传递两个参数:

    --skip-grant-tables

    --skip-networking

    通过更新授权表的方式直接更改其密码,而后移除两个选项重启服务器

    日志

    错误日志

    mysql选项:

    log_error

    log_warnings

    erver启动和关闭过程的信息

    server运行过程中的错误信息

    事件调度器运行一个事件时产生的信息

    在从服务器上启动从服务器进程时产生的信息

    一般查询日志

    general_log

    general_log_file

    log

    还可以保存到表中,默认不开启,要手动创建该表

    慢查询日志

    long_query_time 默认为10秒

    log_slow_queries={YES|NO}

    slow_query_log 默认关闭

    slow_query_log_file 数据目录下的localhost-slow.log

    二进制日志:任何引起或可能引起数据库变化的操作(DDL,DML):复制,即时点恢复

    mysqlbinlog

    --start-datetime 'yyyy-mm-dd hh:mm:ss' 起始时间

    --stop-datetime 'yyyy-mm-dd hh:mm:ss' 结束时间

    --start-position 起始位置

    --stop-position 结束位置

    二进制日志的格式

    基于语句:statement

    基于行:row

    混合方式:mixed

    二进制日志事件:

    产生事件

    相对位置

    查看当前正在使用的二进制日志文件

    mysql> SHOW MASTER STATUS;

    查看二进制日志事件

    mysql> SHOW BINLOG ENENTS IN 'mysql-bin.000000x' [FROM position];

    查看所有二进制日志文件

    mysql> SHOW BINARY LOGS;

    删除二进制日志

    mysql> PURGE BINARY LOGS TO 'mysql-bin.000000x';

    二进制日志滚动

    mysql> FLUSH LOGS;

    中继日志

    从主服务器的二进制日志文件中复制而来的事件,并保存为的日志文件

    事务日志:保证ACID,将随机IO转换为顺序IO

    innodb_flush_log_at_trx_commit

    0:每秒同步,并执行磁盘flush操作

    1:每事务同步,并执行磁盘flush操作

    2:没事务同步,但不执行磁盘flush操作

    mysql存储引擎

    MyISAM:

    不支持事务

    表锁

    b-tree索引、fulltext索引、空间索引

    支持表压缩

    InnoDB:

    事务

    行锁

    b-tree索引、聚簇索引、自适应hash索引

    表空间,raw磁盘设备

    mysql备份

    备份内容:

    数据

    配置文件

    二进制日志

    事务日志

    备份类型

    热备:读写不受影响

    xtrabackup,mysqldump

    温备:能读不能写

    冷备:离线备份

    物理备份:复制数据文件

    速度快

    逻辑备份:将数据导出至文本文件中

    速度慢、丢失浮点数精度。方便使用文本处理工具直接对其处理、可移植能力强

    完全备份:备份全部数据

    增量备份:仅备份上次完全备份或增量备份以后变化的数据

    差异备份:仅备份上次完全备份以来变化的数据

    备份策略:

    完全+增量

    完全+差异

    mysql备份工具:

    mysqldump:逻辑备份工具、MyISAM(温)、InnoDB(热)

    mysqlhotcopy:物理备份工具、温备

    参考文档:

    MySQL中的事务与锁:http://zheming.wang/blog/2015/04/23/16301743-802B-4795-B79F-5DB37C7D587B/

    相关文章

      网友评论

          本文标题:mysql基础

          本文链接:https://www.haomeiwen.com/subject/qappvftx.html