Centos 7下 MariaDB数据库

一、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';

猜你喜欢

转载自my.oschina.net/u/3803405/blog/1808924
今日推荐