• MySQL数据库管理


    好记性不如烂笔头

    1.MySQL启动基本原理

     /etc/init.d/mysqld 是一个shell启动脚本,启动后会调用mysqld_safe脚本,最后调用的是mysqld主程序启动mysql。

    单实例和多实例启动的区别就是多实例需要指定启动的配置文件

    mysqld_safe --datadir="$datadir" --pid-file="mysql_pid_file_path" $other_args --user=mysql > /dev/null &
    # 单实例启动进程
    /etc/init.d/mysqld start
    # 多实例启动
    /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/dbdata_3306/my.cnf 2>&1 > /dev/null &

    2.MySQL停止

    /etc/init.d/mysqld stop
    # 脚本里的stop方法
    /bin/kill "$MYSQLPID" >/dev/null 2>&1
    # 使用mysqladmin停止服务
    mysqladmin -uroot -p123.com -S /data/dbdata_3306/mysql.sock shutdown

    3.查看进程

    mysql 启动后有如下两个进程
    mysqld_safe 管理进程
    mysqld 工作进程

    [root@cmdb-server ~]# ps -ef | grep mysql | grep -v mysql
    root      1592     1  0 21:13 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
    mysql     1700  1592  0 21:13 ?        00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
    # 查看端口
    ss -lnt | grep 3306

    4.MySQL登录

    # 单实例
    mysql # 老版本以前刚装完系统可以直接登录,5.7以后需要初始化密码 mysql -uroot mysql -uroot -p # dba标准登录命令 mysql -uroot -p'oldboy123' # 引号可加可不加,有特殊符号的时候需要加。一般在脚本里用,密码明文会泄漏密码,可以用history清空历史命令 # 强制linux不记录敏感历史命令 #HISTCONTROL=ignorespace 忽略空格命令,可以在配置文件里设置,使用mysql登录命令时可以在前面加空格。 chmod 700 /data/3306/mysql # 设置MySQL目录权限
    # 多实例
    mysql -uroot -p -S /data/3306/mysql.sock # -S 指定不同的套接字文件登录不同的服务
    mysql -uroot -p -h127.0.0.1 -P3307 # 远程连接无需指定sock文件,但是需要指定数据库服务器IP地址及端口
    # 退出
    quit
    exit
    ctrl键 + DC

    5.设置用户密码

    mysqladmin -uroot password 'oldboy456'  # 没有密码的用户设置或修改密码命令
    mysqladmin -uroot password 'oldboy' -S /data/3306/mysql.sock # 多实例方式设置或修改密码
    -- 老版本数据库 修改用户名密码
    update mysql.user SET password=PASSWORD('oldboy') where user='root' and host='localhost';
    -- 5.7以后
    update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';

    6.创建数据库

    -- 创建数据库 设置字符集utf8
    CREATE DATABASE `data_analysis` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    -- 创建数据库 设置字符集gbk
    create database oldboy_gbk default character set gbk collate gbk_chinese_ci;
    -- 提示:字符集的不一致是数据库的中文内容乱码的罪魁祸首
    -- 查看字符集及校队规则名字的方法
    show character set;
    -- 查看 MySQL 数据库服务器和数据库字符集
    show variables like '%char%';
    
    show databases; -- 显示数据库
    drop database oldboy_gbk; -- 删除数据库
    use oldboy_gbk; -- 进入数据库
    select database(); -- 查看当前的数据库
    select user(); -- 查看当前的用户
    select version(); -- 查看当前的版本
    select now(); -- 查看当前时间

    7.用户、权限

    /*
    授权分两种:
        1.先创建用户再授权
        2.同时授权并创建用户
    */
    DROP USER 'jeffrey'@'localhost'; -- 删除用户
    -- 如果drop删除不了就以root身份用delete直接去用户表里删除,
    delete from mysql.user where user='root' and host='localhost';
    -- 创建用户
    CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 
    -- 查看所有用户
    SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
    -- 查看当前用户权限
    show grants;
    -- 查看指定用户权限
    show grants for 'cactiuser'@'%';
    -- 授权(生产环境常用)
    GRANT SELECT,UPDATE,DELETE,INSERT ON `db_name`.* TO 'user_name'@'localhost';
    -- 授予所有权限
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
    -- 创建用户并同时授权(WITH GRANT OPTION:用户具有赋权的权限, 允许root用户远程操作数据库)
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123.com' WITH GRANT OPTION;
    -- 设置某个网段访问权限及赋权的权限
    GRANT ALL PRIVILEGES ON oldboy_gbk.* TO 'root'@'192.168.93.%' IDENTIFIED BY '123.com' WITH GRANT OPTION;
    -- 使用子网掩码设置某个网段访问权限及赋权的权限
    GRANT ALL PRIVILEGES ON oldboy_gbk.* TO 'root'@'192.168.93.0/255.255.255.0' IDENTIFIED BY '123.com' WITH GRANT OPTION;
    -- 创建用户并授权(privileges可有可无,常用生产环境)
    grant all privileges on oldboy.* to huangxiaoxue@'localhost' identified by 'huangxiaoxue'; 
    -- 收回权限(不包含赋权权限)
    REVOKE all privileges ON bbs.* FROM 'oldboy'@'192.168.93.0';
    -- 收回赋权权限
    revoke grant option on bbs.* from 'oldboy'@'192.168.93.0';
    -- 运行此句才生效,或者重启MySQL
    flush privileges;

    8、表

    -- 建表语法
    create table 表名 (
    字段名 类型
    )
    -- 建表语句
    create table if not exists `student` (
        `id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
        `name` char(20) NOT NULL,
        `age` tinyint(2) NOT NULL DEFAULT '0',
        `dept` varchar(16) DEFAULT NULL
        -- 外键在这里修饰
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    show create table 表名; -- 显示表的创建语句
    drop table student;  -- 删除表
    alter table 表名 rename to 新表名; -- 修改表名
    alter table student character set utf8; -- 修改表的字符集
    alter table student modify name char(20) character set utf8; -- 修改字段的字符集
    alter table 表名 MODIFY 字段名 字段类型; -- (例如:VARCHAR(255) DEFAULT NULL) 修改表的字段类型 
    -- 显示表的结构
    desc 表名;
    SELECT
      COLUMN_NAME,
      DATA_TYPE,
      COLUMN_TYPE,
      COLUMN_COMMENT
    FROM
        information_schema.COLUMNS
    WHERE
        table_name = 'user_info' -- 表名
    AND table_schema = 'api';  -- 库名

     9、字段类型

    http://www.runoob.com/mysql/mysql-data-types.html 详解

    1.INT[(M)]型:正常大小整数型
    2.CHAR(M)型:定长字符串类型,当存储时,总是用空格填满右边到指定的长度。
    优点:查询速度快,不用再计算长度,一次读取指定字节
    缺点:占用存储空间
    3.VARCHAR:变长字符类型
    优点:根据字符串长度存储数据,节省存储空间
    缺点:查询速度慢,需要先计算长度后再读取此长度的字节

    10、索引

    https://www.cnblogs.com/whgk/p/6179612.html 索引详解

    数据库的索引就像书的目录一样,如果在字段上建立索引,那么以索引列为查询条件可以加快查询数据的速度。

    10.1主键索引

    -- 建表语句
    create table if not exists `student` (
        `id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
        `name` char(20) NOT NULL,
        `age` tinyint(2) NOT NULL DEFAULT '0',
        `dept` varchar(16) DEFAULT NULL
        -- 外键在这里修饰
        -- primary key(id) 主键可以放在这里也可以放在定义列的类型里, auto_increment 主键一般自动递增
        key index_name(name), -- name 字段普通索引
        key NameDeptIdx (`name`(20), dept) -- 组合索引
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- 删除字段的自增约束auto_increment
    alter table student change id id int;
    -- 删除主键(必须先删除主键的约束才能删除主键)
    alter table student drop primary key;
    -- 添加主键并且设置主键自增
    alter table student change id id int primary key auto_increment;
    -- 添加索引语法
    ALTER TABLE 表名 ADD INDEX (字段);
    ALTER TABLE 表名 ADD INDEX 索引名称(列名);
    ALTER TABLE student ADD INDEX NameIdx(name);
    -- 字段添加唯一性约束(唯一索引)
    ALTER TABLE `student` ADD unique(`username`);
    CREATE UNIQUE index uni_idx_name ON student(name);
    -- 删除字段索引
    ALTER TABLE tbl_name DROP {INDEX|KEY} index_name;
    DROP INDEX index_name ON tbl_name;
    -- 查看某个数据库表的索引
    SHOW INDEX FROM mytable FROM mydb;
    SHOW INDEX FROM mydb.mytable;
    mysql> desc student;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | char(20)    | NO   | MUL | NULL    |                |
    | age   | tinyint(2)  | NO   |     | 0       |                |
    | dept  | varchar(16) | YES  |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    4 rows in set (0.00 sec)
    /** 注意:
      如果Key是MUL,那么该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL
      如果Key是UNI,代表唯一索引
      提示:
           生产环境数据量很大的时候,比如100万以上数据量的时候,如果建索引会影响用户访问,尽量选择用户访问量少的时候建里索引。
    **/
    -- 对字段的前n个字符创建普通索引
    create index index_name on tbl_name(col_name(length));

    10.2组合索引

    如果查询条件是多列,可以为多个查询列创建组合索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合,也就是前缀特性。

    create index NameDeptIdx on student(name, dept);
    mysql> show index from student;
    +---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table   | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | student |          0 | PRIMARY     |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
    | student |          1 | NameDeptIdx |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
    | student |          1 | NameDeptIdx |            2 | dept        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
    +---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    3 rows in set (0.00 sec)
    -- 建表语句
    create table if not exists `student` (
        `id` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
        `name` char(20) NOT NULL,
        `age` tinyint(2) NOT NULL DEFAULT '0',
        `dept` varchar(16) DEFAULT NULL
        -- 外键在这里修饰
        -- primary key(id) 主键可以放在这里也可以放在定义列的类型里, auto_increment 主键一般自动递增
        -- key index_name(name), -- name 字段普通索引
        key NameDeptIdx (`name`(20), `dept`) -- 组合索引
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    /*
    提示:
         尽量在唯一值多的大表上建立索引。
         如:index(a,b,c),a, ab, abc 三个查询条件会使用索引,而b,bc,ac,c等无法使用索引。尽量把最常用的查询的列放在第一个位置。
         主键组合索引:PRIMARY KEY (`Host`,`User`)
    */

    10.3索引知识小结
    1.索引类似书籍的目录,可以加快查询速度。
    2.要在表的列(字段)上创建索引。
    3.索引会加快查询速度,但也会影响更新、插入的速度,因为更新、插入需要维护索引。
    4.索引并不是越多越好,要在经常查询的条件列上创建索引。
    5.小表或者唯一值少的表上可以不建立索引,要在唯一值多的大表上建立索引。
    6.组合索引有前缀生效特性
    7.当字段内容前N个字符已经唯一时,可以针对字段的前N个字符创建索引。
    8.索引从工作方式上区分,有唯一、主键、普通索引。
    9.索引类型会有BTREE(默认)和hash(适合做缓存(内存数据库))等。

    11、插入

    INSERT INTO tbl_name (col_name, ...) VALUES (value_list); -- 语法
    /*
       1.按顺序指定所有列名和对应的值
       2.由于id列自增,可以不指定id列的值
    */
    insert into student (name, age, dept) values ('hanson', 32, '运维');
    -- 如果不指定列就要按表的字段顺序插入值
    insert into student values ('hanson', 32, '运维');
    -- 批量插入
    insert into student values ('hanson', 32, '运维'), ('小泽玛利亚', 21, '咨询');
    -- 将查询结果插入到表里
    insert into test (name, age) select name, age from student;

    12、查询

    http://www.runoob.com/sql/sql-select.html
    SQL简易教程
    https://www.cnblogs.com/aqxss/p/6563625.html
    查询练习

    语法:select <字段1,字段2,...> from 表名 where 表达式

    -- 查询表中所有数据
    select * from student;
    -- 查询指定字段
    select user,host from mysql.user;
    /*
      LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
    limit 常用于程序分页
    */ SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset; -- limit 语法 SELECT * FROM table LIMIT 5,10; -- 检索记录行 6-15 -- 为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: SELECT * FROM table LIMIT 95,-1; -- 检索记录行 96-last. -- 如果只给定一个参数,它表示返回最大的记录行数目: SELECT * FROM table LIMIT 5; -- 检索前 5 个记录行 -- 换句话说,LIMIT n 等价于 LIMIT 0,n。 -- 注意limit 10和limit 9,1的不同: -- 按指定条件查询 select * from student where name='一本道' and id=3; -- 按指定范围查询 select * from student where id>2 and id<5; select * from student where id between 2 and 5; -- 按id倒序查询 order by select * from student order by id desc;
  • 相关阅读:
    多测师肖老师_git版本控制器之使用(3.2.3)
    多测师肖老师_linux之yum源解决方法(2.3)
    快速排序c++实现
    算法复杂性表示
    lua学习测试脚本
    获取程序当前文件夹 c#
    C#读写注册表 二进制写入
    [转]c# Config修改
    C# 文件版本信息读取
    lua中的table
  • 原文地址:https://www.cnblogs.com/huangxiaoxue/p/8870496.html
Copyright © 2020-2023  润新知