‘壹’ 高级mysql dba必备哪些技能
高级操作
1.Mysql 主从同步配置
2.Mysql 双master 配置
3.Mysql 双master+丛库+keepalived 配置高可用数据库
客户端
作为DBA,一定不要用各种GUI工具,mysql自带命令行client才是你的最佳武器
可选项
1.mysql 分区配置,因为限制太多,实际中分表都是程序做
2.高性能 mysql
a).drizzle
b).MariaDB
c).handlersocket
基本知识
1.mysql的编译安装
2.mysql 第3方存储引擎安装配置方法
3.mysql 主流存储引擎(MyISAM/innodb/MEMORY)的特点
4.字符串编码知识
5.MySQL用户账户管理
6.数据备份/数据入导出
7.mysql 支持的基本数据类型
8.库/表/字段/索引 的创建/修改/删除
9.基本sql 语法:select/insert/update/delete,掌握最基本的语法即可,什么inner join,left join的了解就行 mysql的应用场景大多都是高并发访问/业务逻辑简单,join/子查询/视图/触发器 基本上不用
10.sql 聚集查询:group by/having
11.如何用explain 分析优化查询
12.常见 sql 优化技巧
a).select xx from yyy limited ...,
b).order by random
c).select count(*) from
13.各种show xxx 指令,大概有20种,每个都尝试用一次
14.show VARIABLES; 大概有240项,逐条看懂,可以打印出来贴墙上
‘贰’ 如何在windows里面安装MySQL
Windows上安装MySQL
MySQL针对不同的用户提供了2中不同的版本:
MySQL Community Server:社区版。由MySQL开源社区开发者和爱好者提供技术支持,对开发者开放源代码并提供免费下载。
MySQL Enterprise Server:企业版。包括最全面的高级功能和管理工具,不过对用户收费。
下面讲到的MySQL安装都是以免费开源的社区版为基础。打开MySQL数据库官网的下载地址http://dev.mysql.com/downloads/mysql,上面提供了两种安装文件,一种是直接安装的MSI安装文件,另一种是需要解压并配置的压缩包文件。我这里用的是5.7.10版本的安装。
用MSI安装包安装
根据自己的操作系统下载对应的32位或64位安装包。按如下步骤操作:
第一步:安装许可
双击安装文件,在如下图所示界面中勾选“I accept the license terms”,点击“next”。
经过以上步骤后MySQL服务器安装完成。
‘叁’ 15个 MySQL 基础面试题,DBA 们准备好了吗
问题1:你如何确定 MySQL 是否处于运行状态?
答案: 在Debian 上运行命令 service mysql status,然后看输出即可。
在 RedHat 或者 centos 上运行命令 service mysqld status,然后看看输出即可。
问题2:如何开启或停止 MySQL 服务?
答案:运行命令 service mysqld start 开启服务;
运行命令 service mysqld stop 停止服务。
问题3:如何通过 Shell 登入 MySQL?
答案:运行命令 mysql -u用户名 -p登陆密码
问题4:如何列出所有数据库?
答案:运行命令 show databases;
问题5: 如何切换到某个数据库并在上面工作?
答案:(1)运行命令 use database_name;
(2)进入名为 database_name 的数据库。
问题6:如何列出某个数据库内所有表?
答案:在当前数据库运行命令 show tables;
问题7:如何获取表内所有 Field 对象的名称和类型?
答案:运行命令 describe 表名;
简写为desc 表名;
问题8:如何删除表?
答案:运行命令 drop table 表名;
问题9:如何删除数据库?
答案:运行命令 drop database 数据库名;
问题10:如何查看表内所有数据?
答案:运行命令 select * from 表名;
问题11:如何从表(比如 oc_users )中获取一个 field 对象(比如 uid)的所有数据?
答案:运行命令 select uid from oc_users;
问题12:假设你有一个名为 ‘xyz’ 的表,它存在多个字段,如 ‘createtime’和 ‘engine’,
名为 engine 的字段由 ‘Memoty’ 和 ‘MyIsam’ 两种数值组成。
如何只列出 ‘createtime’ 和 ‘engine’ 这两列,并且 engine 的值为 ‘MyIsam’?
答案:运行命令 select create_time, engine from xyz where engine = “MyIsam” ;
问题13:如何列出表 ‘xrt’ 内 name 域值为 ‘tecmint’,web_address 域值为 ‘tecmint.com’ 的所有数据?
答案:运行命令 select * from xrt where name = “tecmint” and web_address = “tecmint.com” ;
问题14:如何列出表 ‘xrt’ 内 name 域值不为 ‘tecmint’,web_address 域值为 ‘tecmint.com’ 的所有数据?
答案:运行命令 select * from xrt where name != “tecmint” and web_address = “tecmint.com”;
问题15:如何知道表内行数?
答案:运行命令 select count(*) from 表名;
‘肆’ dba的问题
学习dba不是一朝一夕的事情,我个人觉得:
以oracle+unix的模式来学习能让你更好理解
那么首先你需要学习一些基础:
1、sql语言,这是基础中的基础
2、unix基本操作,安装、配置unix、oracle
3、oracle存储结构,oracle文件结构,oracle基础配置
4、sql语句以及执行分析、数据库调优等
5、适当的编程语言以及操作系统知识是需要的
6、坚持不懈
你可以到itpub上找到各个阶段的非常翔实的教程以及资料和faq
‘伍’ mysql 创建完索引之后 ,查询反而变慢了,这是为什么
我们先来看第一个阶段,MySQL慢的诊断思路,一般我们会从三个方向来做:
第一个方向是MySQL内部的观测
第二个方向是外部资源的观测
第三个方向是外部需求的改造
1.1 MySQL 内部观测
我们来看MySQL内部的观测,常用的观测手段是这样的,从上往下看,第一部分是Processlist,看一下哪个SQL压力不太正常,第二步是explain,解释一下它的执行计划,第三步我们要做Profilling,如果这个SQL能再执行一次的话, 就做一个Profilling,然后高级的DBA会直接动用performance_schema ,MySQL 5.7 以后直接动用sys_schema,sys_schema是一个视图,里面有便捷的各类信息,帮助大家来诊断性能。再高级一点,我们会动用innodb_metrics进行一个对引擎的诊断。
除了这些手段以外,大家还提出了一些乱七八糟的手段,我就不列在这了,这些是常规的一个MySQL的内部的状态观测的思路。除了这些以外,MySQL还陆陆续续提供了一些暴露自己状态的方案,但是这些方案并没有在实践中形成套路,原因是学习成本比较高。
1.2 外部资源观测
外部资源观测这部分,我引用了一篇文章,这篇文章的二维码我贴在上面了。这篇文章是国外的一个神写的,标题是:60秒的快速巡检,我们来看一下它在60秒之内对服务器到底做了一个什么样的巡检。一共十条命令,这是前五条,我们一条一条来看。
1.uptime,uptime告诉我们这个机器活了多久,以及它的平均的负载是多少。
2.dmesg -T | tail,告诉我们系统日志里边有没有什么报错。
3.vmstat 1,告诉我们虚拟内存的状态,页的换进换出有没有问题,swap有没有使用。
4. mpstat -P ALL,告诉我们CPU压力在各个核上是不是均匀的。
5.pidstat 1,告诉我们各个进程的对资源的占用大概是什么样子。
我们来看一下后五条:
首先是iostat-xz 1,查看IO的问题,然后是free-m内存使用率,之后两个sar,按设备网卡设备的维度,看一下网络的消耗状态,以及总体看TCP的使用率和错误率是多少。最后一条命令top,看一下大概的进程和线程的问题。
这个就是对于外部资源的诊断,这十条命令揭示了应该去诊断哪些外部资源。
1.3 外部需求改造
第三个诊断思路是外部的需求改造,我在这里引用了一篇文档,这篇文档是MySQL的官方文档中的一章,这一章叫Examples of Common Queries,文档中介绍了常规的SQL怎么写, 给出了一些例子。文章的链接二维码在slide上。
我们来看一下它其中提到的一个例子。
它做的事情是从一个表里边去选取,这张表有三列,article、dealer、price,选取每个作者的最贵的商品列在结果集中,这是它的最原始的SQL,非常符合业务的写法,但是它是个关联子查询。
关联子查询成本是很贵的,所以上面的文档会教你快速地把它转成一个非关联子查询,大家可以看到中间的子查询和外边的查询之间是没有关联性的。
第三步,会教大家直接把子查询拿掉,然后转成这样一个SQL,这个就叫业务改造,前后三个SQL的成本都不一样,把关联子查询拆掉的成本,拆掉以后SQL会跑得非常好,但这个SQL已经不能良好表义了,只有在诊断到SQL成本比较高的情况下才建议大家使用这种方式。
为什么它能够把一个关联子查询拆掉呢?
这背后的原理是关系代数,所有的SQL都可以被表达成等价的关系代数式,关系代数式之间有等价关系,这个等价关系通过变换可以把关联子查询拆掉。
上面的这篇文档是一个大学的教材,它从头教了关于代数和SQL之间的关系。然后一步步推导怎么去简化这句SQL。
第一,MySQL本身提供了很多命令来观察MySQL自身的各类状态,大家从上往下检一般能检到SQL的问题或者服务器的问题。
第二,从服务器的角度,我们从巡检的脚本角度入手,服务器的资源就这几种,观测手法也就那么几种,我们把服务器的资源全部都观察一圈就可以了。
第三,如果实在搞不定,需求方一定要按照数据库容易接受的方式去写SQL,这个成本会下降的非常快,这个是常规的MySQL慢的诊断思路。
‘陆’ 求助,MySql 5.6.17 授权用户问题
慢慢看吧
mysql中可以给你一个用户授予如select,insert,update,delete等其中的一个或者多个权限,主要使用grant命令,用法格式为:
grant 权限 on 数据库对象 to 用户
一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
grant select on testdb.* to common_user@’%’
grant insert on testdb.* to common_user@’%’
grant update on testdb.* to common_user@’%’
grant delete on testdb.* to common_user@’%’
或者,用一条 mysql 命令来替代:
grant select, insert, update, delete on testdb.* to common_user@’%’
二、grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。
grant 创建、修改、删除 mysql 数据表结构权限。
grant create on testdb.* to developer@’192.168.0.%’;
grant alter on testdb.* to developer@’192.168.0.%’;
grant drop on testdb.* to developer@’192.168.0.%’;
grant 操作 mysql 外键权限。
grant references on testdb.* to developer@’192.168.0.%’;
grant 操作 mysql 临时表权限。
grant create temporary tables on testdb.* to developer@’192.168.0.%’;
grant 操作 mysql 索引权限。
grant index on testdb.* to developer@’192.168.0.%’;
grant 操作 mysql 视图、查看视图源代码 权限。
grant create view on testdb.* to developer@’192.168.0.%’;
grant show view on testdb.* to developer@’192.168.0.%’;
grant 操作 mysql 存储过程、函数 权限。
grant create routine on testdb.* to developer@’192.168.0.%’; - now, can show procere status
grant alter routine on testdb.* to developer@’192.168.0.%’; - now, you can drop a procere
grant execute on testdb.* to developer@’192.168.0.%’;
三、grant 普通 dba 管理某个 mysql 数据库的权限。
grant all privileges on testdb to dba@’localhost’
其中,关键字 “privileges” 可以省略。
四、grant 高级 dba 管理 mysql 中所有数据库的权限。
grant all on *.* to dba@’localhost’
五、mysql grant 权限,分别可以作用在多个层次上。
1. grant 作用在整个 mysql 服务器上:
grant select on *.* to dba@localhost; - dba 可以查询 mysql 中所有数据库中的表。
grant all on *.* to dba@localhost; - dba 可以管理 mysql 中的所有数据库
2. grant 作用在单个数据库上:
grant select on testdb.* to dba@localhost; - dba 可以查询 testdb 中的表。
3. grant 作用在单个数据表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
4. grant 作用在表中的列上:
grant select(id, se, rank) on testdb.apache_log to dba@localhost;
5. grant 作用在存储过程、函数上:
grant execute on procere testdb.pr_add to ’dba’@’localhost’
grant execute on function testdb.fn_add to ’dba’@’localhost’
六、查看 mysql 用户权限
查看当前用户(自己)权限:
show grants;
查看其他 mysql 用户权限:
show grants for dba@localhost;
七、撤销已经赋予给 mysql 用户权限的权限。
revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:
grant all on *.* to dba@localhost;
revoke all on *.* from dba@localhost;
八、mysql grant、revoke 用户权限注意事项
1. grant, revoke 用户权限后,该用户只有重新连接 mysql 数据库,权限才能生效。
2. 如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 “grant option“
grant select on testdb.* to dba@localhost with grant option;
这个特性一般用不到。实际中,数据库权限最好由 dba 来统一管理。
注意:修改完权限以后 一定要刷新服务,或者重启服务
‘柒’ 请教大家,MySQL安装版与解压版的区别
本文针对mysql-noinstall版本,也就是解压缩版的安装配置应用做了个总结,这些操作都是平时很常用的操作。文章中不对mysql的可执行文件安装版做介绍了,可执行安装版有很多的弊端,我也不一一说了。总之,我喜欢绿色环保的,包括eclipse、tomcat、jboss、apache也是,即使操作系统重装了,这些软件也不需要重装,可谓一劳永逸!
环境:
Windows 2000/XP/2003
mysql-noinstall-5.0.37-win32.zip
一、下载MySQL
http://www.mysql.com/downloads
二、安装过程
1、解压缩mysql-noinstall-5.0.37-win32.zip到一个目录,加入解压缩到E:\myserver目录。
2、编写mysql的运行配置文件my.ini
my.ini
-----------------------------
[WinMySQLAdmin]
# 指定mysql服务启动启动的文件
Server=E:\\myserver\\mysql-5.0.37-win32\\bin\\mysqld-nt.exe
[mysqld]
# 设置mysql的安装目录
basedir=E:\\myserver\\mysql-5.0.37-win32
# 设置mysql数据库的数据的存放目录,必须是data,或者是\\xxx\data
datadir=E:\\myserver\\mysql-5.0.37-win32\\data
# 设置mysql服务器的字符集
default-character-set=gbk
[client]
# 设置mysql客户端的字符集
default-character-set=gbk
-----------------------------
3、安装mysql服务
从MS-DOS窗口进入目录E:\myserver\mysql-5.0.37-win32\bin,运行如下命令:
mysqld --install mysql5 --defaults-file= E:\myserver\mysql-5.0.37-win32\my.ini
4、启动mysql数据库
还在上面的命令窗口里面,输入命令:net start mysql5
这样就启动了mysql服务。
5、(本地)登录mysql数据库
还在上面的命令窗口里面,输入命令:mysql -u root -p
回车后提示输入密码。
mysql解压缩版初次安装管理员root的密码为空,因此直接再回车一次就登入mysql数据库了。
如果你不是初次登录mysql,你还拥有网络地址的用户,那么你可以用如下命令登录到mysql服务器,这个mysql服务器也许在远方,也许在本地。这种登录方式叫“远程登录”,命令如下:
mysql -h 192.168.3.143 -u root -p
mysql -h 192.168.3.143 -u root -pleimin
-h是指定登录ip,-u指定用户,-p指定密码,-p后如果什么都不写,那么接下来会提示输入密码,-p后也可以直接写上密码,这样就不再需要输入密码了。
6、操作数据库和表
登录mysql数据库后,就可以执行指定操作数据库,用命令:use 数据库名
指定了操作的数据库对象后,就可以操作数据库中的表了,操作方法当然是SQL命令了,呵呵。
7、更改mysql数据库管理员root的密码
mysql数据库中默认有个mysql数据库,这个是mysql系统的数据库,用来保存数据库用户、权限等等很多信息。要更改密码,就要操作mysql数据库的user表。
现在mysql的root用户密码还为空,很不安全的,假设要更改密码为“leimin”。
还在上面的命令窗口里面,执行如下命令:
use mysql;
grant all on *.* to root@'%' identified by 'leimin' with grant option;
commit;
这段命令的含义是,添加一个root用户,拥有所有的权限,密码为“leimin”,并且这个用户不但可以本地访问,也可以通过网络访问。强调这个原因是mysql系统自带的的那个root用户只能从本地访问,它@字符后面的标识是localhost。具体可以查看mysql数据的uer表看看,这样以来,就有两个root用户了,一个是系统原来的,一个新建的,为了管理的方便,就将mysql自带root删除,保留刚创建的这个root用户,原因是这个用户可以通过网络访问mysql。
然后,删除用户的命令:
user mysql;
delete from user where user='root' and host='localhost';
commit;
其实上面的方法是授权命令,在授权的同时创建了数据库用户。mysql也有单独的修改用户密码的方法,下面看看如何操作。
首先,先建立一个用户lavasoft,密码为:123456
grant all on *.* to lavasoft@'localhost' identified by '123456' with grant option;
接下来就修改这个用户的密码为:leimin
update user set password = password('leimin') where user = 'lavasoft' and host='localhost';
flush privileges;
说明一点,最好用grant的方式创建mysql用户,尤其对mysql DBA来说,创建用户的同时要指定用户权限,养成好习惯很重要的。
这个修改方法实际上用的是mysql函数来进行的,还有更多的方法,我就不一一介绍了。
还要注意一点就是在修改密码等操作的时候,mysql不允许为表指定别名,但是初次在外却没有这个限制。
8、创建数据库
实际上mysql数据库中除了mysql数据库外,还有一个空的数据库test,供用户测试使用。
现在继续创建一个数据库testdb,并执行一系列sql语句看看mysql数据库的基本操作。
创建数据库testdb:
create database testdb;
预防性创建数据库:
create database if not testdb
创建表:
use testdb;
create table table1(
username varchar(12),
password varchar(20));
预防性创建表aaa:
create table if not exists aaa(ss varchar(20));
查看表结构:
describe table1;
插入数据到表table1:
insert into table1(username,password) values
('leimin','lavasoft'),
('hellokitty','hahhahah');
commit;
查询表table1:
select * from table1;
更改数据:
update table1 set password='hehe' where username='hellokitty';
commit;
删除数据:
delete from table1 where username='hellokitty';
commit;
给表添加一列:
alter table table1 add column(
sex varchar(2) comment '性别',
age date not null comment '年龄'
);
commit;
从查询创建一个表table1:
create table tmp as
select * from table1;
删除表table1:
drop table if exists table1;
drop table if exists tmp;
9、备份数据库testdb
mysqlmp -h 192.168.3.143 -u root -pleimin -x --default-character-set=gbk >C:\testdb.sql
10、删除数据库testdb
drop database testdb;
11、恢复testdb数据库
首先先建立testdb数据库,然后用下面命令进行本地恢复:
mysql -u root -pleimin testdb <C:\testdb.sql
12、删除mysql服务
假如你厌倦mysql了,你需要卸载,那么你只需要这么做
停止mysql服务
net stop mysql5
删除mysql服务
sc delete mysql5
然后删除msyql的安装文件夹,不留任何痕迹。
‘捌’ MySQL:grant 语法详解(MySQL5.X)
本文实例,运行于MySQL5.0
及以上版本。
MySQL
赋予用户权限命令的简单格式可概括为:
grant
权限on
数据库对象to
用户
一、grant
普通数据用户,查询、插入、更新、删除数据库中所有表数据的权利。
grant
select
on
testdb.*
to
common_user@'%'
grant
insert
on
testdb.*
to
common_user@'%'
grant
update
on
testdb.*
to
common_user@'%'
grant
delete
on
testdb.*
to
common_user@'%'
或者,用一条MySQL
命令来替代:
grant
select,
insert,
update,
delete
on
testdb.*
to
common_user@'%'
二、grant
数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。
grant
创建、修改、删除MySQL
数据表结构权限。
grant
create
on
testdb.*
to
developer@'192.168.0.%';
grant
alter
on
testdb.*
to
developer@'192.168.0.%';
grant
drop
on
testdb.*
to
developer@'192.168.0.%';
grant
操作MySQL
外键权限。
grant
references
on
testdb.*
to
developer@'192.168.0.%';
grant
操作MySQL
临时表权限。
grant
create
temporary
tables
on
testdb.*
to
developer@'192.168.0.%';
grant
操作MySQL
索引权限。
grant
index
on
testdb.*
to
developer@'192.168.0.%';
grant
操作MySQL
视图、查看视图源代码权限。
grant
create
view
on
testdb.*
to
developer@'192.168.0.%';
grant
show
view
on
testdb.*
to
developer@'192.168.0.%';
grant
操作MySQL
存储过程、函数权限。
grant
create
routine
on
testdb.*
to
developer@'192.168.0.%';
--
now,
can
show
procere
status
grant
alter
routine
on
testdb.*
to
developer@'192.168.0.%';
--
now,
you
can
drop
a
procere
grant
execute
on
testdb.*
to
developer@'192.168.0.%';
三、grant
普通DBA
管理某个MySQL
数据库的权限。
grant
all
privileges
on
testdb
to
dba@'localhost'
其中,关键字“privileges”
可以省略。
四、grant
高级DBA
管理MySQL
中所有数据库的权限。
grant
all
on
*.*
to
dba@'localhost'
五、MySQLgrant
权限,分别可以作用在多个层次上。
1.
grant
作用在整个MySQL
服务器上:
grant
select
on
*.*
to
dba@localhost;
--
dba
可以查询MySQL
中所有数据库中的表。
grant
all
on
*.*
to
dba@localhost;
--
dba
可以管理MySQL
中的所有数据库
2.
grant
作用在单个数据库上:
grant
select
on
testdb.*
to
dba@localhost;
--
dba
可以查询testdb
中的表。
3.
grant
作用在单个数据表上:
grant
select,
insert,
update,
delete
on
testdb.orders
to
dba@localhost;
4.
grant
作用在表中的列上:
grant
select(id,
se,
rank)
on
testdb.apache_log
to
dba@localhost;
5.
grant
作用在存储过程、函数上:
grant
execute
on
procere
testdb.pr_add
to
'dba'@'localhost'
grant
execute
on
function
testdb.fn_add
to
'dba'@'localhost'
六、查看MySQL
用户权限
查看当前用户(自己)权限:
show
grants;
查看其他MySQL
用户权限:
show
grants
for
dba@localhost;
七、撤销已经赋予给MySQL
用户权限的权限。
revoke
跟grant
的语法差不多,只需要把关键字“to”
换成“from”
即可:
grant
all
on
*.*
to
dba@localhost;
revoke
all
on
*.*
from
dba@localhost;
八、MySQLgrant、revoke
用户权限注意事项
1.
grant,
revoke
用户权限后,该用户只有重新连接MySQL
数据库,权限才能生效。
2.
如果想让授权的用户,也可以将这些权限grant
给其他用户,需要选项“grant
option“
grant
select
on
testdb.*
to
dba@localhost
with
grant
option;
这个特性一般用不到。实际中,数据库权限最好由DBA
来统一管理。
‘玖’ 成为互联网公司mysql DBA需要掌握哪些技能
高级操作
1.Mysql 主从同步配置
2.Mysql 双master 配置
3.Mysql 双master+丛库+keepalived 配置高可用数据库
客户端
作为DBA,一定不要用各种GUI工具,mysql自带命令行client才是你的最佳武器
可选项
1.mysql 分区配置,因为限制太多,实际中分表都是程序做
2.高性能 mysql
a).drizzle
b).MariaDB
c).handlersocket
基本知识
1.mysql的编译安装
2.mysql 第3方存储引擎安装配置方法
3.mysql 主流存储引擎(MyISAM/innodb/MEMORY)的特点
4.字符串编码知识
5.MySQL用户账户管理
6.数据备份/数据入导出
7.mysql 支持的基本数据类型
8.库/表/字段/索引 的创建/修改/删除
9.基本sql 语法:select/insert/update/delete,掌握最基本的语法即可,什么inner join,left join的了解就行 mysql的应用场景大多都是高并发访问/业务逻辑简单,join/子查询/视图/触发器 基本上不用
‘拾’ 如何利用mysql系统命令直接查询某字段出现在所在的表方法
MYSQL没有类似于MSSQLSERVER的sysobjects或者Oracle的dba_tab_comments这样的表,但MYSQL可以用SHOW命令查询数据库和表、字段、索引等信息:
一些SHOW语句提供额外的字符集信息。这些语句包括SHOW CHARACTER SET、SHOW COLLATION、SHOW CREATE DATABASE、SHOW CREATE TABLE和SHOW COLUMNS。
SHOW CHARACTER SET命令显示全部可用的字符集。它带有一个可选的LIKE子句来指示匹配哪些字符集名。