zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/huangxiaoxue/p/8870496.html
Copyright © 2011-2022 走看看