本文旨在复习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
在此处根据需求还可以进行一定修改,如字符集设置、日志文件设置、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
数据库基本操作
创建数据库
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;
表管理
创建表
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,要求如下
用户ID | userid,INT,自增,主键 |
姓名 | username,定长,20 |
QQ号 | qq,INT,12 |
mail,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));
索引管理
创建索引
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);
用户管理
值得一提的是,MariaDB和MySQL的登陆机制很特殊,账号验证有2部分组成:身份信息+登陆主机,即我们常见的'username'@'host' 这意味着输入了正确的账号密码未必能成功登陆,必须在合法授权的主机上才可以登陆。
此处,为root设置密码后,我使用ip地址来连接登陆,一探究竟;
显然即便我们输入了正确的用户名密码,使用不同的连接主机也不一定能成功对吗?这就涉及到接下来的用户及权限管理问题了。
用户账号: 'username'@'host'
host可使用IP、网络地址、使用通配符(_和%);
创建用户账号,并赋予密码
CREATE USER 'username'@'host' IDENTIFIED BY [PASSWORD] 'password';
删除用户
DROP USER 'username'@'host';
查看用户
SELECT host,user FROM mysql.user;
权限管理
用户连接进数据库后,并不意味着他拥有所有库的任何权限,这些权限是可以细分的,比如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'@'%';