Linux学习之路--Mariadb基本使用操作20---20180123
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习之路--Mariadb基本使用操作20---20180123相关的知识,希望对你有一定的参考价值。
一、MariaDB程序
1、MariaDB的程序组成
Client
mysql:CLI交互式客户端程序
mysqldump,mysqladmin...
Server
mysqld_safe
mysqld
mysqld_multi:多实例
服务器监听的两种socket地址:
ip socket: 监听在tcp的3306端口,支持远程通信
unix sock: 监听在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),仅支持本机通信
server: localhost, 127.0.0.1 自动使用unix sock命令行交互式客户端程序mysql选项:
--print-defaults 默认选项
--verbose 显示祥细信息
-uUSERNAME: 用户名;默认为root
-hHOST: 服务器主机; 默认为localhost
-pPASSWORD:用户的密码;建议使用-p,默认为空密码mysql用户账号由两部分组成:
'USERNAME'@'HOST'
HOST用于限制此用户可通过哪些远程主机连接mysql服务
支持使用通配符:
% 匹配任意长度的任意字符
172.16.0.0/255.255.0.0 或 172.16.%.%
_ 匹配任意单个字符
2、简单执行命令
运行mysql命令:默认空密码登录
mysql>use mysql
mysql>select user();查看当前用户
mysql>SELECT User,Host,Password FROM user;安全初始化
/usr/local/mysql/bin/mysql_secure_installatoin登录系统:mysql –uroot –p
客户端命令:本地执行
mysql> help
每个命令都完整形式和简写格式
mysql> status 或 \s服务端命令:通过mysql协议发往服务器执行并取回结果
每个命令都必须命令结束符号;默认为分号
SELECT VERSION();
3、关系型数据库的常见组件
数据库:databases
表:table
列:column
行:row
索引:index
视图:view
用户:user
权限:privilege
存储过程:procedure,无返回值
存储函数:function,有返回值
触发器:trigger
事件调度器:event scheduler,任务计划
二、SQL语言的兴起与语法标准
20世纪70年代,IBM开发出SQL,用于DB2
1981年,IBM推出SQL/DS数据库
业内标准微软和Sybase的T-SQL,Oracle的PL/SQL
SQL作为关系型数据库所使用的标准语言,最初是基于IBM的实现在1986年被批准的。1987年,“国际标准化组织(ISO)”把ANSI(美国国家标准化组织) SQL作为国际标准。这个标准在1992年进行了修订(SQL-92),1999年再次修订(SQL-99),目前最新的是SQL-2003
Keyword组成clause
多条clause组成语句
SELECT * SELECT子句
FROM products FROM子句
WHERE price>400 WHERE子句
这是一组语句,由三个子句构成,SELECT,FROM和WHERE都是关键字
1、SQL语句分类
DDL: Data Defination Language
CREATE, DROP, ALTERDML: Data Manipulation Language
INSERT, DELETE, UPDATEDCL:Data Control Language
GRANT, REVOKEDQL:Data Query Language
SELECT
2、SQL语言规范
在数据库系统中,SQL语句不区分大小写(建议用大写)
但字符串常量区分大小写
SQL语句可单行或多行书写,以“;”结尾
关键词不能跨多行或简写
用空格和缩进来提高语句的可读性
子句通常位于独立行,便于编辑,提高可读性
注释:
SQL标准:
/*注释内容*/ 多行注释
-- 注释内容 单行注释,注意有空格MySQL注释:
#
3、数据库对象的命名规则
必须以字母开头
可包括数字和三个特殊字符(# _ $)
不要使用MySQL的保留字
同一database(Schema)下的对象不能同名
4、数据库操作
创建数据库:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
CHARACTER SET 'character set name'
COLLATE 'collate name'删除数据库
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';查看支持所有字符集
SHOW CHARACTER SET;
查看支持所有排序规则
SHOW COLLATION;
获取命令使用帮助:
mysql> HELP KEYWORD;查看数据库列表:
mysql> SHOW DATABASES;
5、创建表
CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修饰符, col2 type2 修饰符, ...)
字段信息
col type1
PRIMARY KEY(col1,...)
INDEX(col1, ...)
UNIQUE KEY(col1, ...)表选项:
ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine类型
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}获取帮助:mysql> HELP CREATE TABLE;
6、表操作
查看所有的引擎
SHOW ENGINES;
查看表
SHOW TABLES [FROM db_name];
查看表结构
DESC [db_name.]tb_name;
删除表
DROP TABLE [IF EXISTS] tb_name;
查看表创建命令
SHOW CREATE TABLE tbl_name;
查看表状态
SHOW TABLE STATUS LIKE 'tbl_name'\G
三、数据类型
数据类型:
数据长什么样?
数据需要多少空间来存放?系统内置数据类型和用户定义数据类型
MySql支持多种列类型:
数值类型
日期/时间类型
字符串(字符)类型选择正确的数据类型对于获得高性能至关重要,三大原则:
更小的通常更好,尽量使用可正确存储数据的最小数据类型
简单就好,简单数据类型的操作通常需要更少的CPU周期
尽量避免NULL,包含为NULL的列,对MySQL更难优化
1、整型
tinyint(m) 1个字节 范围(-128~127)
smallint(m) 2个字节 范围(-32768~32767)
mediumint(m) 3个字节 范围(-8388608~8388607)
int(m) 4个字节 范围(-2147483648~2147483647)
bigint(m) 8个字节 范围(+-9.22*10的18次方)
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~255)
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围
MySQL可以为整型类型指定宽度,例如Int(11),对绝大多数应用这是没有意义的:它不会限制值的合法范围,
只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,Int(1)和Int(20)是相同的
2、浮点型(float和double),近似值
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位
double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小数位
设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位
3、定点数
在数据库中存放的是精确值,存为十进制
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位
MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如,decimal(18,9)小数点两边将各存储9个数字,
一共使用9个字节:小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占1个字节
浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储。double占用8个字节
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal——例如存储财务数据。
但在数据量比较大的时候,可以考虑使用bigint代替decimal
4、字符串(char,varchar,_text)
char(n) 固定长度,最多255个字符
varchar(n)可变长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符
BINARY(M) 固定长度,可存二进制或字符,允许长度为0-M字节,
VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
内建类型:ENUM枚举, SET集合
5、char和varchar:
char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n< n>255),所以varchar(4),存入3个字符将占用4个字节。
char类型的字符串检索速度要比varchar类型的快
6、varchar和text:
varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n< n>255),text是实际字符数+2个字节。
text类型不能有默认值
varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text
7、二进制数据:BLOB
BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写
BLOB存储的数据只能整体读出
TEXT可以指定字符集,BLOB不用指定字符集
8、日期时间类型
date 日期 '2008-12-2'
time 时间 '12:25:36'
datetime 日期时间 '2008-12-2 22:06:44'
timestamp 自动存储记录修改时间
YEAR(2), YEAR(4):年份
timestamp字段里的时间数据会随其他字段修改的时候自动刷新,这个数据类型的字段可以存放这条记录最后被修改的时间
9、修饰符
所有类型:
?NULL 数据列可包含NULL值
?NOT NULL 数据列不允许包含NULL值
?DEFAULT 默认值
?PRIMARY KEY 主键
?UNIQUE KEY 唯一键
?CHARACTER SET name 指定一个字符集数值型
?AUTO_INCREMENT 自动递增,适用于整数类型
?UNSIGNED 无符号
#示例 CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED); DESC students; CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));
四、表操作及索引
DROP TABLE [IF EXISTS] 'tbl_name';
ALTER TABLE 'tbl_name'
字段:
添加字段:add
ADD col1 data_type [FIRST|AFTER col_name] 删除字段:drop
修改字段:
alter(默认值), change(字段名), modify(字段属性)
索引:
添加索引:add index
删除索引: drop index
表选项
修改:查看表上的索引:SHOW INDEXES FROM [db_name.]tbl_name;
查看帮助:Help ALTER TABLE
#修改表示例 ALTER TABLE students RENAME s1; ALTER TABLE s1 ADD phone varchar(11) AFTER name; ALTER TABLE s1 MODIFY phone int; ALTER TABLE s1 CHANGE COLUMN phone mobile char(11); ALTER TABLE s1 DROP COLUMN mobile; Help ALTER TABLE 查看帮助 ALTER TABLE students ADD gender ENUM('m','f') ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY; ALTER TABLE students ADD UNIQUE KEY(name); ALTER TABLE students ADD INDEX(age); DESC students; SHOW INDEXES FROM students; ALTER TABLE students DROP age;
索引是特殊数据结构;定义在查找时作为查找条件的字段
优点:提高查询速度
缺点:占用额外空间,影响插入速度创建索引必须要有索引名称
创建索引:
CREATE INDEX index_name ON tbl_name (index_col_name,...);
help CREATE INDEX删除索引:
DROP INDEX index_name ON tbl_name;查看索引:
SHOW INDEXES FROM [db_name.]tbl_name;
五、语句及账号授权
1、DML语句
DML: INSERT, DELETE, UPDATE
?INSERT
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (val1,...),(...),...
?UPDATE:
UPDATE tbl_name SET col1=val1, col2=val2, ... [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
?DELETE:
DELETE FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
可先排序再指定删除的行数
?TRUNCATE TABLE tbl_name; 清空表
2、DQL语名
DQL:SELECT
?SELECT col1,col2,... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
Limit m,n 跳过m个,要n个字段表示法:
*: 所有字段
as:字段别名,col1 AS alias1
3、DQL语句
WHERE clause:
操作符:
=, != >, <, >=, <=
BETWEEN ... AND ...
LIKE:
%:任意长度的任意字符
_:任意单个字符;
RLIKE:正则表达式模式匹配
IS NULL ,IS NOT NULL
IN (val1,val2,…) NOT IN (val1,val2,…)
条件逻辑操作:
AND,OR,NOT
#示例 DESC students; INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f'); INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen'); SELECT * FROM students WHERE id < 3; SELECT * FROM students WHERE gender='m'; SELECT * FROM students WHERE gender IS NULL; SELECT * FROM students WHERE gender IS NOT NULL; SELECT * FROM students ORDER BY name DESC LIMIT 2; SELECT * FROM students ORDER BY name DESC LIMIT 1,2; SELECT * FROM students WHERE id >=2 and id <=4 SELECT * FROM students WHERE BETWEEN 2 AND 4 SELECT * FROM students WHERE name LIKE ‘t%’ SELECT * FROM students WHERE name RLIKE '.*[lo].*'; SELECT id stuid,name as stuname FROM students
3、用户账号
用户账号:'user'@'host'
user: 用户名
host: 允许用户通过哪些主机远程连接mysqld服务
IP、网络地址、主机名、通配符(%和_)创建用户:
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];查看当前用户:
SELECT user();查看用户:
SELECT User,Host,Password FROM user;删除用户:DROP USER 'username'@'host';
示例:删除默认的空用户
DROP USER ''@'localhost';更改口令:
1)SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
2) UPDATE user SET password=PASSWORD('magedu') WHERE User='root' ;
注意:上面修改表的命令不会马上生效,需执行FLUSH PRIVILEGES生效
3) /usr/local/mysql/bin/mysqladmin -u root –poldpassword password 'newpassword'
4、授权
权限级别:管理权限、数据库、表、字段、存储例程
?Help GRANT
?GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
?priv_type: ALL [PRIVILEGES]
?db_name.tb_name:
*.*: 所有库的所表
db_name.*: 指定库的所有表
db_name.tb_name: 指定库的指定表
db_name.routine_name:指定库的存储过程和函数示例:
GRANT SELECT,DELETE on testdb.* TO ‘testuser’@‘%’IDENTIFIED BY 'testpass';查看指定用户获得的授权:
Help SHOW GRANTS
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()];回收授权:
REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host'
示例:
REVOKE DELETE ON testdb.* FROM 'testuser'@'%'注意:MariaDB服务进程启动时会读取mysql库中所有授权表至内存
(1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
(2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES;
六、简单操作
1、查看目前软件使用版本信息
MariaDB [(none)]> \s -------------- mysql Ver 15.1 Distrib 5.5.59-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 21 Current database: Current user: [email protected] SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 5.5.59-MariaDB Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /app/mysql/mysql.sock Uptime: 7 hours 34 min 42 sec Threads: 2 Questions: 128 Slow queries: 0 Opens: 4 Flush tables: 2 Open tables: 28 Queries per second avg: 0.004 --------------
2、数据库中执行shell命令
MariaDB [(none)]> \! pwd /root MariaDB [(none)]> \! ls /app/ mysql website website2 website3
3、修改mysql提示符
--prompt=format_str
The prompt command reconfigures the default mysql> prompt. The string for defining the prompt can contain the following special sequences.(prompt命令重新配置默认的mysql>提示符。用于定义提示符的字符串可以包含以下特殊序列。)
│ 选项 │ 说明 |
│\ c│计数器对于您发出的每个声明都会递增
│\ D│全部日期
│\ d│默认数据库
│\ h│服务器主机
│\ l│当前分隔符(5.1.12新增)
│\ m│当前时间的分钟
│\ n│换行符
│\ O│以三个字母的格式显示当月(1月,2月,...)
│\ o│数字格式的当前月份
│\ P│am / pm
│\ p│当前的TCP / IP端口或套接字文件
│\ R│目前时间,在24小时军事时间(0-23)
│\ r│当前时间,标准12小时时间(1-12)
│\ S│分号
│\ s│当前时间的秒数
│\ t│制表符
│\ U│完整的用户名@主机名帐户名
│\ u│你的用户名
│\ v│服务器版本
│\ w│以三个字母的格式(星期一,二,...)
│\ Y│本年度,四位数字
│\ y│本年度,两位数字
│\ _│一个空格
│\ │空格(空格跟在反斜杠后面)
│\' │单引号
│\“│双引号
│\\ │文字“\”反斜杠字符
│\ x│x,对于以上未列出的任何“x”
示例
使用环境变量。您可以将MYSQL_PS1环境变量设置为提示字符串。
例如:shell> export MYSQL_PS1 ="(\[email protected]\h) [\d]>"使用命令行选项。您可以在命令行上将--prompt选项设置为mysql。对于
例如:shell> mysql --prompt ="(\[email protected]\h) [\d]>"
(用户@主机)[数据库]>
使用选项文件。您可以在任何MariaDB选项的[mysql]组中设置提示选项文件,例如/etc/my.cnf或主目录中的.my.cnf文件。例如:[MySQL的]
prompt=(\\[email protected]\\h)[\\d]>\\_
在这个例子中,请注意反斜杠加倍。如果使用选项文件中的提示选项设置提示,建议在使用特殊提示选项时加倍反斜杠。可选提示选项集和选项文件中识别的一组特殊转义序列有一些重叠。如果使用单个反斜杠,重叠可能会导致问题。例如,\ s被解释为一个空格而不是当前的秒数值。以下示例显示了如何在选项文件中定义提示以包含HH:MM:SS>格式的当前时间:
[MySQL的]
prompt ="\\r:\\m:\\s>"交互式设置提示。您可以使用提示符(或\ R)命令交互式地更改提示。例如:+
mysql> prompt (\[email protected]\h) [\d]>\_
PROMPT set to ′(\[email protected]\h) [\d]>\_′
([email protected])[database]>
([email protected]) [database]> prompt
Returning to default PROMPT of mysql>
mysql>
[[email protected]~]#vim /etc/my.cnf.d/mysql-clients.cnf # # These groups are read by MariaDB command-line tools # Use it for options that affect only one utility # [mysql] prompt=(\\[email protected]\\h) [\\d]>\\_
4、查看user表中用户信息
MariaDB [(none)]> select user,host,password from mysql.user; +--------+----------------+-------------------------------------------+ | user | host | password | +--------+----------------+-------------------------------------------+ | root | localhost | | | root | centos6-server | | | root | 127.0.0.1 | | | root | ::1 | | | | localhost | | | | centos6-server | | | syslog | 192.168.1.102 | *128977E278358FF80A246B5046F51043A2B1FCED | | syslog | 192.168.1.% | *128977E278358FF80A246B5046F51043A2B1FCED | +--------+----------------+-------------------------------------------+ 8 rows in set (0.00 sec)
5、在数据库中修改root口令
MariaDB [(none)]> \! passwd Changing password for user root. New password:
6、查询安装程序的路径
[[email protected]~]#mysql -e 'show variables like "basedir";' +---------------+------------------+ | Variable_name | Value | +---------------+------------------+ | basedir | /usr/local/mysql | +---------------+------------------+
注意:如果是yum 及 二进制安装,实现多实例可以不用指定--basedir,但如果是源码编译,实现多实例,必须制定 --basedir= 的路径
7、yum安装高版本mariadb
官网找到高版本yum源地址
添加base仓库
[[email protected]~]#vim /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.2/centos6-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 [[email protected]~]#yum info MariaDB-server [[email protected]~]#service mysql start MariaDB [(none)]> \s -------------- mysql Ver 15.1 Distrib 10.2.13-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 9 Current database: Current user: Server: MariaDB Server version: 10.2.13-MariaDB MariaDB Server
8、修改多实例数据库登陆口令
#第一种修改方法 [[email protected]~]#mysqladmin -uroot -S /mysqldb/3307/socket/mysql.sock password 'centos'
#第二种修改方法 MariaDB [(none)]> update mysql.user set password=password("centos") where user='root'; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0 MariaDB [(none)]> select user,password,host from mysql.user; +------+-------------------------------------------+--------------+ | user | password | host | +------+-------------------------------------------+--------------+ | root | *128977E278358FF80A246B5046F51043A2B1FCED | localhost | +------+-------------------------------------------+--------------+ MariaDB [(none)]> flush privileges; #注意,修改表格,一定要刷新 Query OK, 0 rows affected (0.01 sec)
9、删除匿名用户
MariaDB [(none)]> drop user ''@localhost ; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> drop user ''@'centos6-mini'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; #注意,修改表格,一定要刷新 Query OK, 0 rows affected (0.01 sec)
10、查看默认使用的字符集
#yum安装的信息 MariaDB [(none)]> show variables like '%character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | #客户端 | character_set_connection | utf8 | #连接 | character_set_database | latin1 | #数据库 | character_set_filesystem | binary | #文件系统 | character_set_results | utf8 | #结果 | character_set_server | latin1 | #服务器 | character_set_system | utf8 | #系统 | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec) #源码编译安装的信息 MariaDB [(none)]> show variables like '%character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /app/mysql/share/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec)
11、破解数据库口令
#第一步,进入主配置文件,加入关键字 [[email protected]~]#vim /etc/my.cnf [mysqld] skip_grant_tables [[email protected]~]#systemctl restart mariadb #第二步,进入数据库进行口令修改 MariaDB [(none)]> updata mysql.user set password=password("centos") where host='localhost'; #注意,生产环境中,一定要注意where,如果没带,对整个表修改,是非常危险的。 #第三步,修改主配置文件,去掉加入的关键字
12、用户登录账号密码免输入
[[email protected]~]#vim /etc/my.cnf.d/clinent.cnf [clinent] user=root password=centos
以上是关于Linux学习之路--Mariadb基本使用操作20---20180123的主要内容,如果未能解决你的问题,请参考以下文章