mysql配置文件 加载顺序
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql
/etc/my.cnf
~/.my.cnf
【简书版本】
/etc/mysql/my.cnf ----------------我好像没这个目录
/etc/my.cnf
~/.my.cnf
默认情况下,MySQL启动时,会依次读取以上配置文件,如果文件内容有重复选项, 会以最后一个文件设置的为准。 但是,如果启动时加入了--defaults-file=xxxx时,以上的所有文件都不会读取.
配置文件相关
[标签] (带中括号)区分不同程序的参数 配置项=xxxx (配置参数)
标签类型:服务端、客户端 服务器端标签:负责数据库服务端运行参数设定 [mysqld] [mysqld_safe] [server]
客户端标签:映像客户端连接(只影响本地客户端连接) [mysql] [mysqldump] [client]
配置文件的示例展示: cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/app/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock server_id=6
port=3306 log_error=/data/mysql/mysql.log
[mysql]
socket=/tmp/mysql.sock
命令行参数的优先级高于配置
mysql的启动和关闭:
xxx/xxx/xxx/mysqld & mysqld_safe (脚本)用于定制默认功能 mysql.server启动性质的脚本(具有start|stop|restart等功能) (启动模式是从下到上) mysqld和mysqld_safe进入方式关闭得进入数据库输入shutdown mysqladmin -u -p shutdown
===============================================================
多实例---------一台主机上装多台数据库
【个人认知 就是在一台主机上 给每个数据库 分别划分
端口
数据目录
配置文件
然后分别初始化 并启动数据库
【注意】、MySQL多实例是指安装MySQL之后,我们可以在一台Linux服务器上同时启动多个MySQL数据库(实例),不需要安装多个MySQL;如果是有多台Linux服务器,那么我们需要每台服务器都分别安装MySQL;
===============================================================
=============================================================
char 和 varchar 区别
char 定长 (例如 定长10 但是我的数据只有 6个字符 那么会在右边补4个空格)不是左边补0
varchar 变长 (短于255个字符时 还要一个字节来存储长度 长于255时 还要两个字节来存储长度
一个汉字在utf-8中占3 个字节
在utf8mb4中 占4个字节
库名不能用 汉字
因为会删不掉 汉字库
建表语句示例
create table student( id int not null primary key auto_increment, name varchar(32) not null, sex varchar(8) default('男'), #设置默认值 age int not null check (age between 10 and 50), #设置取值范围 class_id int not null references class(id), stu_num varchar(32), constraint stu_u unique(stu_num) );
建库建表不能用大写名不能数字开头不能汉字 而且不要太长
建表每个字段都使用 varchar(255)是否合理
不合理 要选择合适的类型 全使用varchar会占用底层空间 字符串和数字是有严格区分的
alter table xxx add ; -------------在最后添加
alter add after xxx; --------------在xxx后面添加
alter add first;---------------在最前面的列前加
涉及修改 元数据的 都是DDL语句
==========================================================================课后总结笔记===============================================================
mysql 命令行常用参数:
-u -----------用户
-p ------------(小写)密码
-P ------------(大写)端口
-h -------------IP
-S -------------(大写) socket文件 (-socket=name //连接服务器的socket文件)多实例中有妙用
-e -------------免交互执行命令(只执行一条命令 没必要进入数据库 的时候 如下)
< -------------导入SQL脚本(也可以进去数据库 再 source /xxx/yyy.sql)
命令使用示例:
mysql -uroot -p -e "select user,host from mysql.user;"
Enter password:
❗mysql -uroot -p <world.sql --------例如有的数据库是SQL脚本形式的 (.sql)
Enter password:
mysql配置文件加载顺序
使用命令 mysql --help|grep my.cnf 查看
不同的主机 配置文件不一样 可能查看到的顺序不一样---------【自我理解】
【百度到的】----------------------不知对错
① 仅仅正确设定/usr/local/mysql/etc/my.cnf的内容设,将2-4的内容注释掉,发现无法正常登录。
② /usr/local/mysql/etc/my.cnf的内容设定为错误信息,将3-4的内容注释掉,仅仅将/etc/my.cnf设定正确,能够登录说明其他错误内容均未被使用,
③1-2的内容均为错误,将~/.my.cnf内容注释掉,仅仅将/etc/mysql/my.cnf设定正确,能够登录说明其他错误内容均未被使用
④1-3的内容均为错误,将~/.my.cnf内容设定正确,能够登录说明其他错误内容均未被使用,
⑤在1-4的用户名/密码均不正确的情况下,defaults-file指定的内容正确即可登录,
⑥defaults-file中使用的错误的用户名和密码的情况下,只要-u和-p的内容正确,就会登录,说明defaults-file的优先度低于直接使用参数命令行的方式。
⑦在1-4的输入全部出错的情况下,命令行方式仍然能够正确登录,说明会优先确认命令行的参数。
多实例安装 ----- 一台服务器安装多台数据库服务器实例
字符集和字符集规则
企业内常用,utf8或者utf8mb4两种字符集,字符集规则也用相应的引擎。
一般查看支持那些字符集的命令:show charset;
区别:
utf8mb4支持的编码比utf8更多。emoji字符在utf8mb4支持,在utf8不支持
(原因:表情字符一个占4个字节。utf8只能存3个字节utf8mb4能存下)
汉字 在 utf8 中 占 3 个字节
在 utf8mb4 中 占 4 个字节
######
数据类型
(一) 字符串
char --------定长的字符串类型,在存储字符串时,例如设置最大字符长度11个时,会立即分配11个字符长度的存储空间,如果存不满,空格填充。
varchar-------变长的字符串类型看,例如设置最大字符长度11个。在存储字符串时,自动判断字符长度,不会用空格填充。按需分配存储空间。
enum('bj','tj','sh')-------枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,
可以很大程度的优化我们的索引结构
【扩展】
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节
char也是一样
(二)数字类型
tinyint : -128~127(指的时位数,此处3位)
int :-2^31~2^31-1(同上,计算可得,最高10位)
说明:手机号(11位)是无法存储到int的。一般是使用char类型来存储手机号
tinyint 型的字段如果设置为UNSIGNED类型,只能存储从0到255的整数,不能用来储存负数。
tinyint 型的字段如果不设置UNSIGNED类型,存储-128到127的整数。
1个tinyint型数据只占用一个字节;一个INT型数据占用四个字节。
int(4)、int(8)、int(10) 究竟占用几个字节呢 ?
答案已经在上面写明啦已经呼之欲出啦,他们都是 4 个字节。
(三)时间类型
DATETIME 8字节
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
TIMESTAMP 4字节 (使用较多)
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp会受到时区的影响
建库 create database 库名 charset utf8mb4;
建表 示例
create table dafu (
id int(10) NOT NULL AUTO_INCREMENT,
name char(10) NOT NULL,
age int(3) NOT NULL DEFAULT ‘18’,
PRIMARY KEY `id` ----------------这里是反引号 而且最后一条不需要逗号
);
主键可以单独写 也可以直接加在 主键后面
例如 id int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
注意,一个表 可以 设置主键 也可以不设置主键 根据需求而定
常见约束
primary key :主键约束,作用:唯一且非空每张表只能有一个主键。作为聚簇索引
not null : 非空约束,作用:必须非空。建议每列都为非空
unique :唯一键 唯一约束。列值不能重复
unsigned :无符号。针对数字列,非负数。
default :默认值。列中,没有录入值时,会自动使用default的值填充
auto_increment: 自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
comment : 注释
not null primary key unique unsigned auto_increment comment
库定义相关:
库名,库属性。
建库:create database xxx charset utf8mb4;(规范如下)
查库:show databases, show create database 库名;
修改库:只能从小了往大改,目前utf8mb4最大。(避免出现乱码)
alter database xxx charset utf8;(修改语句)-------只能修改属性 例如 字符编码
删库:危险性(生产禁制操作,处了管理员)
drop database xxx;
========================================================================
❗❗❗❗注意 alter 不能修改数据库的名字
如果要修改数据库的名字可以用 : rename database olddbname to newdbname
同样 alter 也不能修改表的名字或者用户的名字
都需要用 rename : rename user oldname@ip1 to newname@ip2;
rename table oldname to newname;
=======================================================================
建库规范:
1.库名不能有大写字母 ,不能使用保留字符 (反引号会强制创建)(也不能用汉字,会导致删不掉库)
2.建库要加字符集 ------charset utf8mb4
3.库名不能有数字开头
\4. 库名要和业务相关
使用某个数据库 ----------- use 数据库名
表定义相关:
创建表语法:
create table stu(
列1 属性(数据类型、约束、其他属性) ,
列2 属性,
列3 属性
)
建表规范:
\1. 表名小写,不要太长,不能是用关键字。(不大写的原因是多平台兼容问题)
\2. 不能是数字开头
\3. 注意字符集和存储引擎 (ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 默认跟随数据库)
\4. 表名和业务有关
\5. 选择合适的数据类型,必须要有主键
\6. 每个列都要有注释
\7. 每个列设置为非空,无法保证非空,用0来填充。
查看表属性语句:(查看表结构)
desc 表名字;
mysql>show create table 表名;(具体信息查看方式)
修改表定义:
默认在最后添加-----------ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL UNIQUE COMMENT 'qq号';
在某一列后面添加--------ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname ; (在sname 列 后面添加)
在最前面添加-------------ALTER TABLE stu ADD num INT NOT NULL COMMENT '数字' FIRST;
修改表字段以及属性:
-- ALTER TABLE 表名 CHANGE 原字段名 新字段名 字段类型 约束条件
ALTER TABLE user10 CHANGE test test1 CHAR(32) NOT NULL DEFAULT '123';
备注:修改时注意修改字段的相关属性,或者带上原属性,否则会默认覆盖属性导致数据属性变化变成脏数据。
也就是说 修改就相当于 重新设置 原来的设置都会清空
====================================================================================================================DCL-------权限控制
:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。
关键字
-
GRANT
-
REVOKE
授权
grant 权限1,权限2,...,权限n on 库名.表名 to 用户名@主机 【identified by "密码"】------密码项可写可不写
查看权限
SHOW GRANTS FOR 用户名@IP;
撤销权限
REVOKE 权限1,权限2,...,权限n ON 数据库名.* FROM 用户名@IP;
【扩展】
grant 还可以直接授予一个角色给一个用户
对数据库权限:
-
SELECT
:表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。 -
INSERT
:表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。 -
DELETE
:表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。 -
UPDATE
:表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。 -
REFERENCES
:表示授予用户可以创建指向特定的数据库中的表外键的权限。 -
CREATE
:表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。 -
ALTER
:表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。 -
SHOW VIEW
:表示授予用户可以查看特定数据库中已有视图的视图定义的权限。 -
CREATE ROUTINE
:表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。 -
ALTER ROUTINE
:表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。 -
INDEX
:表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。 -
DROP
:表示授予用户可以删除特定数据库中所有表和视图的权限。 -
CREATE TEMPORARY TABLES
:表示授予用户可以在特定数据库中创建临时表的权限。 -
CREATE VIEW
:表示授予用户可以在特定数据库中创建新的视图的权限。 -
EXECUTE ROUTINE
:表示授予用户可以调用特定数据库的存储过程和存储函数的权限。 -
LOCK TABLES
:表示授予用户可以锁定特定数据库的已有数据表的权限。 -
SHOW DATABASES
:表示授权可以使用SHOW DATABASES
语句查看所有已有的数据库的定义的权限。 -
ALL
或ALL PRIVILEGES
:表示以上所有权限。
对表的权限:
-
SELECT
:授予用户可以使用 SELECT 语句进行访问特定表的权限。 -
INSERT
:授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限。 -
DELETE
:授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限。 -
DROP
:授予用户可以删除数据表的权限。 -
UPDATE
:授予用户可以使用 UPDATE 语句更新特定数据表的权限。 -
ALTER
:授予用户可以使用 ALTER TABLE 语句修改数据表的权限。 -
REFERENCES
:授予用户可以创建一个外键来参照特定数据表的权限。 -
CREATE
:授予用户可以使用特定的名字创建一个数据表的权限。 -
INDEX
:授予用户可以在表上定义索引的权限。 -
ALL
或ALL PRIVILEGES
:所有的权限名。
================================================================
创建用户的三种方式
(一) create user
create user 用户名@ip [identified by "密码"]
如果在创建的过程中,只给出了用户名,而没指定主机名,那么主机名默认为“%”
新用户可以没有初始密码,若该用户不设密码,可省略此子句。
(二)insert into mysql.user
INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');
由于 mysql 数据库的 user 表中,ssl_cipher、x509_issuer 和 x509_subject 这 3 个字段没有默认值,所以向 user 表插入新记录时,一定要设置这 3 个字段的值,否则 INSERT 语句将不能执行。
(三)grant
GRANT 权限 ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']
直接授权一个账号