一、Centos 7二进制安装配置 MariaDB数据库
很久没安装数据库服务器了,记得上次 MySQL 安装配置的时候,系统还是 Cenots 6.5 ,现在 Centos 系统版本更新太快,都跟不上步伐了,刚好最近公司需要几台 Mariadb Server 刚好练练手。
由于每家公司的数据库服务器 版本不同,但我依然推荐大家使用 Mariadb 数据库,至少目前该社区及产品非常稳定,至于有什么新功能,建议去其官方了解更多特性。
查看系统版本命令
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) x64
安装 MariaDB(MySQL)
下载MariaDB二进制安装包:
https://downloads.mariadb.org
解压并安装 Mariadb-devel 静态库:
$ yum install mariadb-devel numactl -y
$ mkdir /renwole
$ cd /renwole
$ tar zxvf mariadb-10.2.8-linux-glibc_214-x86_64.tar.gz
移动目录并创建软连接:
$ mv mariadb-10.2.8-linux-glibc_214-x86_64 /usr/local
$ cd /usr/local
$ ln -s mariadb-10.2.8-linux-glibc_214-x86_64 mysql
创建 MariaDB(MySQL)用户和组
$ groupadd mysql
$ useradd -g mysql mysql
赋予 MariaDB(MySQL)目录权限:
$ cd /usr/local/mysql
$ chown -R root .
$ chown -R mysql data
配置 MariaDB(MySQL)
删除自带的 my.cnf 配置文件,并创建新的配置文件:
$ rm -rf /etc/my.cnf
$ cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf
注:/usr/local/mysql/support-files下有5个配置文件,请根据服务器的内存大小选择配置文件(你也可以自定义优化my.cnf配置文件,如果你之前有,只要是同版本就可以正常使用,从而无须再次创建,MariaDB(MySQL)启动的时候会自动到/etc下寻找my.cnf文件)。
文件分别是:
my-small.ini (内存 < = 64M)
my-medium.ini (内存 128M )
my-large.ini (内存 512M)
my-huge.ini (内存 1G-2G)
my-innodb-heavy-4G.ini (内存 4GB)
在my.cnf文件的 mysqld 字段加入数据库路径:
$ vim /etc/my.cnf
datadir = /usr/local/mysql/data
注意:这个路径就是初始化数据库用的,将来你的数据库都存在这个目录,这个存储路径是可以更改到其他路径的,以免将来系统宕机带来不必要的损失,所以请根据自己的需求更换相对的路径,别忘记给权限就行。
初始化数据库
$ cd /usr/local/mysql/scripts
$ ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
$ cd /usr/local/mysql/support-files
$ cp mysql.server /etc/init.d/mysql
$ chmod +x /etc/init.d/mysql
$ systemctl enable mysql
添加系统变量,例如直接输入:mysql -uroot -p 会提示无此命令:
$ vim /etc/profile
在文件末端添加以下内容:
PATH=$PATH:/usr/local/mysql/bin
export PATH
使变量立即生效并启动Mysql数据库:
$ source /etc/profile
$ systemctl restart mysql
$ ss -antp
初始化MariaDB(MySQL)安全账户
$ /usr/local/mysql/bin/mysql_secure_installation
注意:回车提示你输入MariaDB(MySQL)密码,新安装的mysql密码默认为空,所以直接回车,然后输入Y设置MySQL密码,输入两次回车即可,接下来全部按Y即可(大致意思是删除test数据库、匿名账号、最后Y配置生效。
二、Mariadb数据库及表管理
数据库管理
佛曰:“先有库,后有表,再有数据…..”
创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
例如:创建数据库,并指定默认字符集为UTF-8
SHOW CHARACTER SET;//查看支持的字符集
CREATE DATABASE mydb CHARACTER SET='utf8'; //创建数据库mydb,并指定字符集为utf-8
查看数据库创建信息
MariaDB [(none)]> SHOW CREATE DATABASE mydb;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| mydb | CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)
`
修改数据库
ALTER {DATABASE | SCHEMA} [db_name]
alter_specification ...
ALTER {DATABASE | SCHEMA} db_name
UPGRADE DATA DIRECTORY NAME //这条命令在升级数据库时,使用此命令重新编码数据库文件
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_nam
修改数据库mydb的字符集为utf-16:
MariaDB [(none)]> ALTER DATABASE mydb CHARACTER SET = utf16;
Query OK, 1 row affected (0.00 sec)
删除数据库
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 删除数据库非常的。。。快!所以呢,想好再回车。
MariaDB [(none)]> DROP DATABASE IF EXISTS mydb;
Query OK, 0 rows affected (0.00 sec)
设定数据库默认字符集
只需要在my.cnf中加入此指令即可,在[mysqld]下:
character_set_server = utf8
表管理
创建表
CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...) [table_options ]... [partition_options]
比较基础的就是表定义选项了,如下:
column_definition:
data_type
[NOT NULL | NULL] [DEFAULT default_value | (expression)]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[INVISIBLE] [{WITH|WITHOUT} SYSTEM VERSIONING]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[reference_definition]
例如:创建User表,有4个字段,分别为:ID、用户名、密码、登录时间
MariaDB [mydb]> CREATE TABLE IF NOT EXISTS user(
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(10) NOT NULL,
-> password VARCHAR(32) NOT NULL,
-> logintime TIMESTAMP NOT NULL);
查看表
在Mysql中,可以使用DESCRIBE table_name;来查看表的定义,DESCRIBE可以缩写为DESC,如下:
MariaDB [mydb]> DESC user;
+-----------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
| password | varchar(32) | NO | | NULL | |
| logintime | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-----------+-------------+------+-----+-------------------+-----------------------------+
4 rows in set (0.03 sec)
当然,我们也可以使用SHOW CREATE TABLE table_name;来查看定义表时所使用的命令
MariaDB [mydb]> SHOW CREATE TABLE user;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user | CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(32) NOT NULL,
`logintime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf16 | //这里可以看到这张表使用的存储引擎和字符集
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
修改表
1.为user表添加一个新的字段registtime来记录用户的注册时间
MariaDB [mydb]> ALTER TABLE user ADD COLUMN registtime TIMESTAMP NOT NULL AFTER logintime;
所以,添加字段的格式可以为如下:
ALTER TABLE table_name ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
其中,FIRST与AFTER是指定新添加的字段在什么位置,FIRST代表第一列,而AFTER指示在某一列之后
2.为user表修改一个字段,把刚才新加的registtime字段的数据类型修改为datatime类型
MariaDB [mydb]> ALTER TABLE user MODIFY COLUMN registtime DATETIME;
命令格式如下:
ALTER TABLE table_name MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
`
3.修改字段registtime为createtime
MariaDB [mydb]> ALTER TABLE user CHANGE registtime createtime DATETIME NOT NULL;
命令格式如下,需要重新定义下新的字段:
ALTER TABLE table_name CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
4.删除这个createtime字段,所有行的这个字段的数据也会被删除
MariaDB [mydb]> ALTER TABLE user DROP COLUMN createtime;
5.修改表名user为users
MariaDB [mydb]> ALTER TABLE user RENAME TO users;
6.修改数据表的字符集
MariaDB [mydb]> ALTER TABLE users DEFAULT CHARACTER SET=utf8;
7.修改数据表的存储引擎,有关存储引擎这方面暂时了解的不深,所以这条命令….嗯,你懂得。
MariaDB [mydb]> ALTER TABLE users ENGINE=MyISAM;
会导致数据重建的…所以,谨慎修改
8.修改数据表的排序字段
MariaDB [mydb]> ALTER TABLE users ORDER BY logintime;
删除一个数据表
与删除数据库一样,谨慎按下回车键
MariaDB [mydb]> DROP TABLE IF EXISTS users;
三、Mariadb:数据类型
数据类型
数据类型->是一类具有相同属性、相同性质的数据分类的抽象。
例如:
字符串,就是一个个的字符组成一串就叫字符串…在计算机中可以划分子串、可以在字符串末尾添加新的字符,而这类操作就只能操作字符串数据,而不能操作整数。
数字型,我们最常接触的阿拉伯数字,可以进行算数运算、逻辑运算等操作
Mysql中的数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
1.对于整数类型,可以限制其长度,格式如下:
整数类型[(M)] [SIGNED | UNSIGNED | ZEROFILL]
M为数字的位数,例如TINYINT(3),就只能存储三位数,位数应不超过其所能表示的范围
SIGNED:默认即为有符号数
UNSIGNED:指定为无符号数
ZEROFILL:当不满足M位时,其前用0填充,且为变为无符号数
2.对于浮点数,可限制其整体位数和小数点后位数
(FLOAT|DOUBLE)[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]
M为总的位数,D为小数点后的位数
ZEROFILL对于浮点型,起作用等同于UNSIGNED
MariaDB [mydb]> DESC t1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| c1 | float(5,2) | YES | | NULL | |
| c2 | double(10,3) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
MariaDB [mydb]> INSERT INTO t1 VALUES(23.5,12.34566777);
Query OK, 1 row affected (0.01 sec)
MariaDB [mydb]> SELECT * FROM t1; //这里可以看到,在其后补了0
+-------+--------+
| c1 | c2 |
+-------+--------+
| 23.50 | 12.346 |
+-------+--------+
1 row in set (0.00 sec)
日期和时间类型
格式缩写: 日期时间格式,除了标准的格式以外还支持松散的格式。
创建测试表,结构如下:
MariaDB [mydb]> desc datetable;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| c1 | date | YES | | NULL | |
| c2 | time | YES | | NULL | |
| c3 | datetime | YES | | NULL | |
| c4 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
对于DATE型:YY-MM-DD、YYMMDD、YYYY/MM/DD
MariaDB [mydb]> INSERT INTO datetable(c1) VALUES('2018-01-01'),('18-01-01'),
-> ('180101'),('2018/01/01'),(180101);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
MariaDB [mydb]> SELECT c1 FROM datetable;
+------------+
| c1 |
+------------+
| 2018-01-01 |
| 2018-01-01 |
| 2018-01-01 |
| 2018-01-01 |
| 2018-01-01 |
+------------+
5 rows in set (0.00 sec)
对于TIME型:'D HH:MM:SS'、'HH:MM:SS'、'HH:MM'、'D HH:MM'、'D HH', 'SS'、 'HHMMSS'
D代表天,即TIME+D*24
MariaDB [mydb]> INSERT INTO datetable(c2) VALUES
-> ('12:20:20'),('1 12:20:20'),
-> ('12:20'),('1 12'),('20'),('122020'),
-> (122020);
Query OK, 7 rows affected (0.03 sec)
Records: 7 Duplicates: 0 Warnings: 0
MariaDB [mydb]> SELECT c2 FROM datetable;
+----------+
| c2 |
+----------+
| 12:20:20 |
| 36:20:20 |
| 12:20:00 |
| 36:00:00 |
| 00:00:20 |
| 12:20:20 |
| 12:20:20 |
+----------+
7 rows in set (0.00 sec)
对于DATETIME和TIMESTAMP这两种格式,即是上面时间简写格式的缩写,例如:
20180101122020 -> '2018-01-01 12:20:20'
对于TIMESTAMP这种格式,比较常用吧应该说,其存储的是自'1970-01-01 00:00:00'到存储时间的毫秒数,其默认值可以为CURRENT_TIMESTAMP或其同义词:
CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP,LOCALTIMESTAMP()
字符串类型
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB是一个二进制大对象,可以容纳可变数量的数据:
有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
其他类型
枚举型:ENUM('value1','value2',…)
存储字节:因其存储的是元素编号,所以对于0-255个元素,只占一个字节,而255-65535则占两个元素
四、Mariadb:数据的插入删除与修改
INSERT插入数据
INSERT语句格式:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [PARTITION (partition_list)] [(col,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col=expr
[, col=expr] ... ]
表结构如下:
MariaDB [mydb]> DESC user;
+----------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
| password | varchar(10) | NO | | NULL | |
| regtime | timestamp | NO | | CURRENT_TIMESTAMP | |
| logtime | timestamp | NO | | 0000-00-00 00:00:00 | |
| logip | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------------------+----------------+
6 rows in set (0.01 sec)
插入单条数据
MariaDB [mydb]> INSERT INTO user VALUES(1,'test','test',NOW(),NOW(),'127.0.0.1');
因为在很多时候有些值是默认的,所以我们可以指定为哪些列插入数据,而其他列则使用默认值,如下:
MariaDB [mydb]> INSERT INTO user(username,password) VALUES('test2','test2');
同样的,插入特定列数据还可以这样写:
MariaDB [mydb]> INSERT INTO user SET username='test3',password='test3';
这样就仅仅插入了用户名和密码,其他值则使用默认。
MariaDB [mydb]> SELECT * FROM user;
+----+----------+----------+---------------------+---------------------+-----------+
| id | username | password | regtime | logtime | logip |
+----+----------+----------+---------------------+---------------------+-----------+
| 1 | test | test | 2018-02-24 15:43:41 | 2018-02-24 15:43:41 | 127.0.0.1 |
| 2 | test2 | test2 | 2018-02-24 15:45:16 | 0000-00-00 00:00:00 | NULL |
| 3 | test3 | test3 | 2018-02-24 15:46:56 | 0000-00-00 00:00:00 | NULL |
+----+----------+----------+---------------------+---------------------+-----------+
3 rows in set (0.00 sec)
插入多行数据
很多时候我们会有使用一条INSERT语句向数据表插入多条记录的需求,就可以这样写:
MariaDB [mydb]> INSERT INTO user(username,password) VALUES('test4','test4'),('test5',
-> 'test5');
莫名其妙的优先级?
当使用的存储引擎(MyISAM, MEMORY, MERGE)使用表级锁的时候,可以使用
LOW_PRIORITY| HIGH_PRIORITY这两个关键字:
当使用LOW_PRIORITY关键字时,当没有客户端再读取该表时才写入数据。
当使用HIGH_PRIORITY时,INSERT语句具有同SELECT语句一样的优先级。(默认策略)
所以,当INSERT语句执行前有SELECT语句执行时,INSERT阻塞并等待SELECT读取完毕,但此时,如果有SELECT再次进入调度,则SELECT被阻塞(按理读锁可以直接读)但此时因为INSERT语句跟SELECT语句有同样的优先级,所以SELECT要等INSERT结束才能执行,所以INSERT可以加LOW_PRIORITY来优化读取速度。
这里慢慢看吧,对锁这个东西懂的不是很多。
修改数据
UPDATE语句语法如下:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
[PARTITION (partition_list)]
SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
更新所有
当不使用WHERE子句约束选择条件的时候,则更新所有数据,例如,修改user表所有记录的登陆时间为现在:
MariaDB [mydb]> UPDATE user SET logtime=NOW();
Query OK, 5 rows affected (0.01 sec)
Rows matched: 5 Changed: 5 Warnings: 0
更新最早注册的三个人的登录IP为127.0.0.1
MariaDB [mydb]> UPDATE user SET logip='127.0.0.1' ORDER BY regtime LIMIT 3;
ORDER BY语句可以用于SELECT UPDATE DELETE等,是指示该表输出、删除、更新时遵循该表哪个字段排列。
例如以上,ORDER BY regtime就是根据注册时间来正序排列更新,并且配合LIMIT语句只更新了前三行。
再使用DESC来指定倒叙排列,例如:ORDER BY regtime DESC
LIMIT语句:用于限制查询结果的条数。
用法:
LIMIT[位置偏移量,]行数
第一行从0开始,所以以下:
SELECT * FROM user LIMIT 2,2; //从第3行开始,取两行,即取第3、4条记录。
使用WHERE语句选中特定行更新
MariaDB [mydb]> UPDATE user SET logip='192.168.1.2' WHERE username='test2';
因为WHERE子句也有很多东西,这里就不过多贴内容了。
LOW_PRIORITY:这个跟INSERT的LOW_PRIORITY是一样的。
REPLACE语句
MariaDB [mydb]> REPLACE INTO user VALUES(1,'test111','test111',NOW(),NOW(),'192.168.1.1');
以上这条语句是MariaDB的扩展SQL,相当于删除重复(主键或唯一索引)的记录再添加新的记录。
好像有点鸡肋?….
删除数据
DELETE语语法:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM tbl_name [PARTITION (partition_list)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
[RETURNING select_expr
[, select_expr ...]]
删除所有数据
不使用WHERE语句来约束条件时,则删除所有数据,如下:
MariaDB [mydb]> DELETE FROM user;
使用WHERE语句约束选中行
MariaDB [mydb]> DELETE FROM user WHERE username='test1';