本文旨在复习MariaDB二进制安装以及基本管理


基础知识


1、MariaDB是MySQL原作者新作,开源社区维护,功能特性相较MySQL至少持平;

2、采用新引擎XtraDB替代MySQL的InnoDB,较早版本5.1上的MySQL默认存储引擎是MyISAM;

3、Xtradb在多核CPU上面的性能和伸缩性要更好;对于内存的分配和使用也要更好;也解除了InnoDB的很多限制;提供了比InnoDB更多的配置和性能监控参数。

4、数据库备份常有冷备、温备、热备,M有ISAM是不支持热备的,应该被淘汰了。

5、最新版本分为5.10和5.5这2个大版本,本次实验环境采用5.5.46


通用二进制安装


MariaDB有3种安装方式,rpm包、编译、通用二进制安装

    1. RPM安装:适合小环境,核心功能都具备,快速搭建环境;

    2. 编译安装:比较推荐,复杂要求高,要有编译环境,可指定几乎所有选项;

    3. 通用二进制安装:最推荐的方式,预先编译过的,既避免了编译的麻烦,又提供增强功能。


步骤1.下载二进制包,可根据自身平台选择

由于我事先在windows中下载好了,这里以共享的方式进行了挂载

mount -t cifs -o username=lance,password=rainbow //192.168.1.106/web /tmp/share
cp /tmp/share/mariadb-5.5.46-linux-x86_64.tar.gz /usr/local

步骤2.解压安装MariaDB到/usr/local路径,并重命名为mysql

cd /usr/local
tar -zxvf mariadb-5.5.46-linux-x86_64.tar.gz 
mv mariadb-5.5.46-linux-x86_64 mysql

步骤3.添加用户和组[让MySQL以mysql身份运行,避免安全风险]

groupadd mysql
useradd -g mysql mysql

步骤4.修改Mysql目录的属主、属组,各级都递归[因为mysql运行时如创建数据库等必须等工作目录、数据库目录进行读写操作,所以必须确保拥有权限]

chown -R mysql:mysql /usr/local/mysql

步骤5.MariaDB的基本安装已经完成,接下来需要修改配置文件、初始化

创建配置文件

cp -a /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y

修改配置文件

vi /etc/my.cnf

wKiom1YsNSyzhJOpAAFZ934MhJ4941.jpg

在此处根据需求还可以进行一定修改,如字符集设置、日志文件设置、binlog文件设置等

请注意:datadir指定的数据库目录是否需要提前创建呢?

不建议提前创建,因为数据库初始化的时候会以mysql用户身份去创建,今后数据库的操作也会同步读写到此目录,而若以root身份提前创建了该目录,可能由于权限问题导致mysql无法正常工作,切记!

步骤7.初始化MariaDB运行

/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mysql_data

步骤8.添加到开机启动项

cp -a /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 2345 mysqld on

步骤9.启动并测试链接

service mysqld start

注意:此时输入mysql可能无法连接,这是因为当前环境变量路径中找不到mysql

echo "export PATH=/usr/local/mysql/bin:$PATH">>/etc/profile
source /etc/profile

wKioL1YsNqWDxup5AAJTAXS2s-A780.jpg


数据库基本操作


创建数据库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification] ...

create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name

删除数据库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

修改数据库

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_name

除此以外,通过SHOW命令可以查看一些数据库的公共属性,总结如下:

SHOW DATABASES;                  --->查看数据库列表;
SHOW CREATE DATABASE db_name;    --->查看指定数据库的详细信息;
SHOW CHARACTER SET;              --->查看MariaDB支持的字符集;
SHOW COLLATION;                  --->查看支持的字符集及默认排序规则;
SHOW VARIABLES;                  --->查看MariaDB全局变量;
HELP SHOW ;                      --->更多的信息可以使用SHOW来查看;

例1:创建一个名为lance的数据库,如果不存在则创建,创建完成后,修改数据库字符集为GB2312

CREATE DATABASE IF NOT EXISTS lance;
SHOW CHARSET;
ALTER DATABASE lance CHARACTER SET=gb2312;

wKiom1YsOlqBqo8JAAGZ96Tinng323.jpg


表管理


创建表

CREATE TABLE [IF NOT EXISTS] tbl_name (col1 type1 dec1, col2 type2 dec2, ...)

删除表

DROP TABLE

修改表

ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
    [alter_specification [, alter_specification] ...]
    [partition_options]

查看表的基本结构

DESC tbl_name
SHOW [FULL] TABLES [{FROM | IN} db_name]
     [LIKE 'pattern' | WHERE expr]

例2:使用刚才的lance数据库,创建一个表userinfo,要求如下

用户IDuserid,INT,自增,主键
姓名username,定长,20
QQ号qq,INT,12
Emailmail,varchar(20)
use lance;
CREATE TABLE userinfo (userid INT UNSIGNED NOT NULL PRIMARY KEY,username CHAR(30) NOT NULL,qq INT UNSIGNED,mail VARCHAR(20));

wKioL1YsPpPD_UWSAAHvwdPwpgo216.jpg


索引管理


创建索引

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON tbl_name (index_col_name,...)

删除索引

DROP INDEX index_name ON tbl_name

查看索引

SHOW INDEX FROM db_name.table_name

例3:在创建表userinfo的时候,字段userid指明了PRIMARY KEY,其实就是一种唯一键索引,这里我们再创建一个QQ号字段的索引,索引名为qq;

CREATE UNIQUE INDEX qq ON userinfo(qq);

wKioL1YsQLqxJ9w6AAJyb96a7M4025.jpg


用户管理


值得一提的是,MariaDB和MySQL的登陆机制很特殊,账号验证有2部分组成:身份信息+登陆主机,即我们常见的'username'@'host' 这意味着输入了正确的账号密码未必能成功登陆,必须在合法授权的主机上才可以登陆。

此处,为root设置密码后,我使用ip地址来连接登陆,一探究竟;

wKioL1YsQi7SdaNUAAIYrsSs2m0721.jpg

显然即便我们输入了正确的用户名密码,使用不同的连接主机也不一定能成功对吗?这就涉及到接下来的用户及权限管理问题了。

用户账号: 'username'@'host'

  host可使用IP、网络地址、使用通配符(_和%);

创建用户账号,并赋予密码

CREATE USER 'username'@'host' IDENTIFIED BY [PASSWORD] 'password';

删除用户

DROP USER 'username'@'host';

查看用户

SELECT host,user FROM mysql.user;

wKiom1YsRNngdCrxAAF8XSGV_B4628.jpg


权限管理


用户连接进数据库后,并不意味着他拥有所有库的任何权限,这些权限是可以细分的,比如A用户对A库有全部权限,B用户对A库只有只读权限,等等,这就牵扯到授权、回收机制了。

也可以授权给函数等等,如果用户事先不存在,则创建此账号并授权;

ALL [PRIVILEGES]:所有权限

授权:

GRANT priv1,... ON db_name.tbl_name TO 'username'@'host' [IDENTIFIED BY [PASSWORD] 'password'];

查看用户已经获得的授权

SHOW GRANTS [FOR user]

收回授权

REVOKE priv1,... ON db_name.tbl_name FROM 'username'@'host';

例4:创建一个用户,允许来自任何地方的连接,但是仅对数据库lance有全部权限,对于其他的数据库无权限

CREATE USER 'onlylance'@'%' IDENTIFIED BY [PASSWORD] 'zxczxc';
GRANT ALL ON lance.* TO 'onlylance'@'%';

wKiom1YsRjmCUregAAHlhjPhZXQ827.jpg

wKioL1YsRnKzZvt4AAKVmLI64kk612.jpg