您的位置:首页 > 博客中心 > 数据库 >

Linux自学笔记——mysql基础、备份和恢复、主从复制、MHA

时间:2022-03-16 11:21

RDBMS:关系型数据库管理系统

       C/S:通过专有协议

       关系模型:表(行,列),二维关系;

       范式:第一范式、第二范式、第三范式(在之前的博客中已经做过说明)

       关系运算:

              选择      投影

       数据库:表,索引,视图(虚表)

              SQL:Structure Query Language

                     DDL,DML

                     编程接口:

                            存储过程

                            存储函数

                            触发器

                            事件调度器

                            过程式编程:选择、循坏

       三层模型:

              物理层  逻辑层  视图层

       解决方案:

              Oracle, Sybase, Infomix, DB2

              MySQL, MariaDB, PostgreSQL, SQLite

MariaDB

       插件式存储引擎

       单进程多线程

              连接线程

              守护线程

配置文件:集中式的配置,能够为mysql的各应用程序提供配置信息

       [mysqld]

       [mysqld_safe]

       [mysqld_multi]

       [server]

       [mysql]

       [mysqldump]

       [client]

启动查找路径:/etc/my.cnf à /etc/mysql/my.cnf à $MYSQL_HOME/my.cnf à --default-extra-file=/path/to/somedir/my.cnf à ~/.my.cnf

安装方法:

       os vendor:rpm

       MYSQL:

              rpm

              展开可用

              源码

安装后的设定:

1)      为所有root用户设定密码;

mysql>SET PASSWORD FOR

mysql> update mysql.user SET password=PASSWORD(‘your_pass’) WHERE clause;

#mysqladmin

2)      删除所有匿名用户

Mysql>DROP USER ‘’@’localhost’;

上述两步骤可运行命令:mysql_secure_installation

3)      建议关闭主机名反解功能;

skip_name_resolve = ON

 

mysql --> mysqld

客户端程序:

       mysql:交互式的CLI工具;

mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中;

mysqladmin:基于mysql协议管理mysqld;

mysqlimport:数据导入工具;

 

非客户端类的管理工具:

       myisamchk,myisampack

 

如何获取程序默认使用的配置;

       mysql --print-defaults

       mysqld --print-defaults

 

客户端类应用程序的可用选项:

       -u, --user=   

       -h, --host=   

       -p, --passowrd=  

       -P, --port=   

       --protocol=

       -S, --socket=

       -D, --database=

       -C, --compress

 

       mysql -e "SQL"

 

mysql的使用模式:

       交互模式:

              可运行命令有两类:

                     客户端命令:

                            \h,help

                     服务器端命令:

                            SQL,需要语句结束符(冒号;)

       脚本模式:

              # mysql -uUSERNAME -hHOST -pPASSWORD < /path/from/somefile.sql

              mysql> source /path/from/somefile.sql

 

服务器端(msyqld):工作特性有多种定义方式

       命令行选项

       配置文件参数

              获取可用参数列表:

                     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:ANSI SQL

       SQL-86, SQL-89, SQL-92, SQL-99, SQL-03

 

MYSQL数据类型:

       字符型

       数值型

       日期时间型

       內建类型

 

       字符型:

              CHAR, BINARY:定长数据类型;

              VARCHAR, VARBINARY:变长数据类型;需要结束符;

              TEXT:TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT

              BLOB: TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB

              ENUM, SET

       字符型修饰符:

              NOT NULL:非空约束;

              NULL:

              DEFAULT ‘STRING’:指明默认值;

              CHARACTER SET ‘’:使用的字符集;

              COLLATION:使用的排序规则;

             

              mysql > SHOW CHARACTER SET;

                  技术分享图片

              msyql> SHOW COLLATION;

                  技术分享图片

       数值型:

              精确数值型:

                     整型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT

                     十进制型:DECIMAL

              近似数值型

                     浮点型:

                            FLOAT

                            DOUBLE

                     BIT

       整型数据修饰符:

              NOT NULL

              NULL

              DEFAULT NUMBER

              AUTO_INCREMENT:

                     UNSIGNED

                     PRIMARY KEY|UNIQUE KEY

                     NOT NULL

                    mysql> SELECT LAST_INSERT_ID();

                        技术分享图片

       日期时间型:

              DATE

              TIME

              DATETIME

              TIMESTAMP

              YEAR(2), YEAR(4)

       日期时间型修饰符:

              NOT NULL

              NULL

              DEFAULT

       內建类型SET和ENUM的修饰符:

              NOT NULL

              NULL

              DEFAULT

 

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, or STRICT_ALL_TABLES

       DDL:数据定义语言;

              CREATE,ALTER,DROP

              DB组件:数据库、表、索引、视图、用户、存储过程、存储函数、触发器、事件调度器等;

              CREATE相关的常用命令:

                     CREATE DATABASE

                       CREATE EVENT

                        CREATE FUNCTION

                        CREATE FUNCTION UDF

                        CREATE INDEX

                        CREATE PROCEDURE

                        CREATE SERVER

                        CREATE TABLE

                        CREATE TABLESPACE

                        CREATE TRIGGER

                        CREATE USER

                        CREATE VIEW

       DML:数据操作语言;

              INSERT,DELETE,UPDATE,SELECT

       数据库:

              CREATE,ALTER,DROP

                     {DATABASE|SCHEMA}

                     [IF EXISTS]

                     [IF NOT EXISTS]

       表:二维关系

              设计表:遵循规范;

              定义:字段,索引

                     字段:字段名,字段数据类型,修改符

                     约束,索引:应该创建在经常用作查询条件的字段上;

                            索引:实现级别在存储引擎;

                                   分类:

                                          稠密索引、稀疏索引;

                                          B+索引、hash索引、R树索引、FULLTEXT索引

                                          聚集索引、非聚集索引

                                          简单索引、组合索引

       创建表:CREATE TABLE

1)      直接创建;

2)      通过查询现存的表创建;新表会被直接插入查询而来的数据;

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

   [(create_definition,...)]

   [table_options]

   [partition_options]

   select_statement

3)      通过复制现存的表的表结构创建;不复制数据;

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }

       注意:Storage Engine是指表类型,也即在表创建时指明其使用的存储引擎;同一个库中表要使用同一种存储引擎类型;

      

查看表结构:

  DESCRIBE tb1_name;

      技术分享图片

查看表状态信息:

  SHOW [FULL] TABLES [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr] 

修改表:ALTER TABLE

删除表:DROP TABLE

 

MYSQL数据文件类型:

       数据文件、索引文件

       重做日志、撤销日志、二进制日志、错误日志、查询日志、慢查询日志、中继日志;

DDL&&DML:

       索引管理:

              按特定数据结构存储的数据;

       索引类型:

              聚集索引、非聚集索引:数据是否与索引存储在一起;

              主键索引、辅助索引

              稠密索引、稀疏索引:是否索引了每一个数据项;

              B+ TREE、HASH、R TREE

              简单索引、组合索引

              左前缀索引;

              覆盖索引;

       管理索引的途径:

              创建索引:创建表时指定:CREATE INDEX

              创建或删除索引:修改表的命令

              删除索引:DROP INDEX

       查看表上的索引:

              SHOW {INDEX | INDEXES | KEYS}

                                       {FROM | IN} tbl_name

                                       [{FROM | IN} db_name]

                                       [WHERE expr]

              技术分享图片

视图:VIEW

       虚表

       创建方法:

              CREATE VIEW view_name [(column_list)] AS select_statement  [WITH [CASCADED | LOCAL] CHECK OPTION]

       删除视图:

              DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT | CASCADE]

       视图中的数据事实上存储于“基表”中,因此,其修改操作也会针对基表实现;其修改操作受基表限制;

 

DML

       INSERT,DELETE,UPDATE,SELECT

       INSERT:

              一次插入一行或多行数据;

              INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

                         [INTO] tbl_name [(col_name,...)]

                         {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

                         [ ON DUPLICATE KEY UPDATE

                           col_name=expr

                             [, col_name=expr] ... ]

              INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)

              技术分享图片

       UPDATE:

              UPDATE [LOW_PRIORITY] [IGNORE] table_reference

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

                     [WHERE where_condition]

                     [ORDER BY ...]

                     [LIMIT row_count]

              注意:一定要有限制条件,否则将修改所有行的指定字段;

                     限制条件:

                            WHERE

                            LIMIT

       SELECT:

              Query Cache

              查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎;

              SELECT语句的执行流程:

                     FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMIT

              单表查询:

                     SELECT

                                [ALL | DISTINCT | DISTINCTROW ]

                                  [SQL_CACHE | SQL_NO_CACHE]

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

                                [FOR UPDATE | LOCK IN SHARE MODE]

                    

                            DISTINCT:数据去重;

                            SQL_CACHE:显示指定存储查询结果于缓存之中;

                            SQL_NO_CACHE:显示查询结果不予缓存;

             

query_cache_type的值为'ON'时,查询缓存功能打开;SELECT的结果符合缓存条件即会缓存,否则,不予缓存;显式指定SQL_NO_CACHE,不予缓存;

query_cache_type的值为'DEMAND'时,查询缓存功能按需进行;显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存;

                     字段显示可以使用别名:

                            col1 AS alias1, col2 AS alias2, ...

                     WHERE子句:指明过滤条件以实现“选择”的功能:

                            过滤条件:布尔型表达式;

                                   算术操作符:+, -, *, /, %

                                   比较操作符:=, !=, <>, <=>, >, >=, <, <=

 

                                   BETWEEN min_num AND max_num

                                   IN (element1, element2, ...)

                                   IS NULL

                                   IS NOT NULL

                                   LIKE:

                                          %: 任意长度的任意字符;

                                          _:任意单个字符;

                                   RLIKE:

                                   REGEXP:匹配字符串可用正则表达式书写模式;

                     逻辑操作符:

                            NOT

                            AND

                            OR

                            XOR

                     GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算:

                            avg(), max(), min(), count(), sum()

                            HAVING: 对分组聚合运算后的结果指定过滤条件;

                     ORDER BY: 根据指定的字段对查询结果进行排序;

                            升序:ASC

                                                降序:DESC 

                                    LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制;

                                        对查询结果中的数据请求施加“锁”:

                                                        FOR UPDATE: 写锁,排他锁;

                                                        LOCK IN SHARE MODE: 读锁,共享锁

                        多表查询:

                                    交叉连接,笛卡尔乘积;

                                    内连接:

                                                等值连接:让表之间的字段以“等值”建立连接关系;

                                                不等值连接

                                                自然连接;

                                                    自连接;

                                    外连接:

                                                    左外连接:

                                                            FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col

                                                    右外连接:

                                                            FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col

                        子查询:在查询语句嵌套着查询语句

                            基于某语句的查询结果再次进行查询

                            用在WHERE子句中的子查询:

1)      用于比较表达式中的子查询;子查询仅能返回单个值:

SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);

2)      用于IN中的子查询:子查询应该单键查询并返回一个或多个值构成列表;

SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);

3)      用于EXISTS;

                            用于FROM子句中的子查询:

                                    使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;

                        联合查询:UNION将两外或多个返回值字段相同的查询的结果合并输出

                            SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;

练习1:导入hellodb.sql生成数据库

    1)  在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄;

        技术分享图片

    2)  以ClassID为分组依据,显示每组的平均年龄;

        技术分享图片

    3)  显示第2题中平均年龄大于30的分组及平均年龄;

        技术分享图片

    4)  显示以L开头的名字的同学的信息;

        技术分享图片

    5)  显示TeacherID非空的同学的相关信息;

        技术分享图片

    6)  以年龄排序后,显示年龄最大的前10位同学的信息;

        技术分享图片

    7)  查询年龄大于等于20岁,小于等于25岁的同学的信息,用三种方法;

        方法一:

            技术分享图片

        方法二:

            技术分享图片          

        方法三:

            技术分享图片

            

练习2:导入hellodb.sql,以下在students表上进行;

    1)  以ClassID分组,显示每班的同学的人数;

       技术分享图片 

    2)  以Gender分组,显示其年龄之和;  

      技术分享图片   

    3)  以ClassID分组,显示其平均年龄大于25的班级; 

      技术分享图片      

    4)  以Gender分组,显示各组中年龄大于25的学员的年龄之和;

      技术分享图片   

 

Mysql的用户和权限:

创建用户账号:

        CREATE USER 'username'@'host' IDENTIFIED BY 'your_password';

删除用户账号:

        DROP USER 'username'@'host';

查看用户获得的权限:

        SHOW GRANTS FOR 'username'@'host';

Mysql的权限级别:

        库级别

        表级别

        字段级别

        管理类

        程序类

 

管理类:

        CREATE TEMPORARY TABLES

CREATE USER

FILE

SUPER

SHOW DATABASES

RELOAD

SHUTDOWN

REPLICATION SLAVE

REPLICATION CLIENT

LOCK TABLES

PROCESS

 

Storage routine:存储例程

                                storage procedure

                                storage function

库和表级别:

ALTER

ALTER ROUTINE

CREATE

CREATE ROUTINE

CREATE VIEW

DROP

EXECUTE

INDEX

GRANT OPTION: 是否可以转授权限的权限;

SHOW VIEW

数据操作(表级别):

SELECT

INSERT

UPDATE

DELETE

 

字段级别:

SELECT(col1,...)

UPDATE(col1,...)

INSERT(col1,...)

 

所有权限:

ALL [PRIVILEGES]

用户重命名:RENAME USER

            RENAME USER old_user_name TO new_user_name

修改密码:

1)      SET PASSWORD FOR

2)      UPDATE mysql.user SET password=PASSWORD('your_password') WHERE clause;

3)      mysqladmin password

mysqladmin [OPTIONS] command command....

-u, -h, -p

 

忘记管理员密码的解决方法:

1)      启动mysqld进程时,为其使用:--skip-grant-tables --skip-networking

2)      使用UPDATE命令修改管理员密码;

3)      关闭mysqld进程,移除上面两个选项,重启mysqld;

mysql中的授权相关的表:

db、host、user

columns_priv、tables_priv, procs_priv

 

授权与取消授权:GRANT, REVOKE

GRANT priv1, priv2, ... ON [TABLE|FUNCTION|PROCEDURE] db_name.tb_name|routine TO 'username'@'host' [IDENTIFIED BY 'password'] [REQUIRE ssl_option] [WITH with_option]

GRANT OPTION

    | MAX_QUERIES_PER_HOUR count

| MAX_UPDATES_PER_HOUR count

| MAX_CONNECTIONS_PER_HOUR count

    | MAX_USER_CONNECTIONS count

REVOKE priv1,priv2,... ON [TABLE|FUNCTION|PROCEDURE] db_name.tb_name|routine FROM 'username'@'host',...;

 

Mysql cache

         SELECT --> QUERY CACHE --> PARSER --> OPTIMIZER --> EXECUTING ENGINE --> STORAGE ENGINE

         缓存:hit(命中),miss(未命中)

                    Key-value

                    衡量缓存的有效性:命中率,hit/(hit+miss)

                   次数;

       query_cache_type

              ON,OFF,DEMAND

              技术分享图片

       SQL_CACHE | SQL_NO_CACHE

              QUERY CACHE:

                     Key:查询语句的hash码;

                     Value:查询语句的执行结果;

       什么样的语句不会缓存?

              查询语句中有不确定数据时不会缓存;

一般来讲,如果查询中包含用户自定义的函数(UDF)、存储函数、用户变量、临时表、mysql库中表、或者任何包含权限信息表,都不会缓存;

       缓存什么场景下比较有效?

              对于存在需要大量资源的查询非常适合启用缓存;

       与缓存功能相关的服务器变量:

              技术分享图片

              Query_cache_limit:mysql能够缓存的最大查询结果;如果某查询的结果大于此值,则不会被缓存;

              Query_cache_min_res_unit:查询缓存中分配内存的最小单位

                     计算公式:(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache

              Query_cache_size:查询缓存的总体可用空间;其必须是1024的倍数;

              Query_cache_wlock_incalidate:当其他会话锁定此次查询用到的资源时,是否不能再从缓存中返回数据;

      

与缓存相关的状态变量:

              技术分享图片

              Qcache_hits/Com_select

              衡量缓存是否足够有效的另一种思路:Qcache_hits/Qcache_inserts

                     如果此比值大于3:1,说明缓存也是有效的;如果高于10:1,相当理想;

              缓存优化的思路:

1)      批量写入比单次写入对缓存的影响要小很多;

2)      缓存空间不宜过大,大量缓存的同时失效会导致Mysql假死;

3)      必要时,使用SQL_CACHE或SQL_NO_CACHE手动控制缓存;

4)      对写密集型的应用场景,禁用缓存反而能提高性能;

碎片整理:FLUSH QUERY_CACHE

清空缓存:RESET QUERY_CACHE

 

Mysql的存储引擎

       表类型:

              CREATE TABLE ... ENGINE=

       InnoDB:

              处理大量的短期事务:

              数据存储于“表空间”中;

1)      所有InnoDB表的数据和索引放置于同一个表空间中;

表空间文件:datadir定义的目录下;

     数据文件:ibddata1,ibddata2,…

2)      每个表单独使用一个表空间存储表的数据和索引;

innodb_file_per_table=ON

数据文件(存储数据和索引):tb1_name.ibd,

表格式定义:tb1_name.frm

              基于MVCC来支持高并发,支持所有的四个隔离级别,默认级别为REPEATABLE READ,间隙锁防止幻读;

              使用聚集索引

              支持“自适应hash索引”

本类排行

今日推荐

热门手游