本文参考自配置啦:Mysql的配置与日常维护sql
应用场景
Mysql的使用过程,经常遇到慢查询分析,性能排查,安全设置,分表设置等.
基础资源
Mysql 5.6
使用须知
注意数据库端口,账号,以及ip白名单等安全设置。 另外注意建立备份机制,将风险降到最低。
配置步骤
mysql数据库的创建.
[场景1] 从零开始: 基于mysql管理工具进行创建.
[场景2] 从现有数据库开始:从其它地方拷贝了数据库目录,只需创建服务。
"安装目录binmysqld.exe" --defaults-file="数据库目录my.ini" MySQL_UserInfo_Service //最后那个是windows服务名称
mysql账号管理与授权管理(设置完成之后,需要重启mysql服务).
root账户登录.
use mysql;
select * from user;
创建用户
CREATE USER ‘validate‘@‘%‘ IDENTIFIED BY ‘db_user1‘;
更改密码
命令:SET PASSWORD FOR ‘username‘@‘host‘ = PASSWORD(‘newpassword‘);如果是当前登陆用户用SET PASSWORD = PASSWORD("newpassword");
例子: SET PASSWORD FOR ‘db_user1‘@‘%‘ = PASSWORD("123456")
授权
命令:GRANT privileges ON databasename.tablename TO ‘db_user1‘@‘host‘
说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL.;databasename - 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示, 如.*.
例子: GRANT SELECT, INSERT ON test.user TO ‘pig‘@‘%‘;
GRANT ALL ON . TO ‘db_user1‘@‘%‘;
示例1:grant select,insert,update,delete,create,drop on test.hr to db_user1@192.168.10.1 identified by ‘123‘;
示例2:grant all privileges on test.* to db_user1@192.168.10.1 identified by ‘123‘;
flush privileges;
注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
GRANT privileges ON databasename.tablename TO ‘db_user1‘@‘host‘ WITH GRANT OPTION;‘; 查看.
撤销授权
命令: REVOKE privilege ON databasename.tablename FROM ‘db_user1‘@‘host‘;
说明: privilege, databasename, tablename - 同授权部分.
例子: REVOKE SELECT ON . FROM ‘db_user1‘@‘%‘;
注意: 假如你在给用户‘db_user1‘@‘%‘授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO ‘db_user1‘@‘%‘, 则在使用REVOKE SELECT ON . FROM ‘db_user1‘@‘%‘;命令并不能撤销该用户对test数据库中user表的SELECT 操作.相反,如果授权使用的是GRANT SELECT ON . TO ‘pig‘@‘%‘;则REVOKE SELECT ON test.user FROM ‘pig‘@‘%‘;命令也不能撤销该用户对test数据库中user表的Select 权限.
具体信息可以用命令SHOW GRANTS FOR ‘db_user1‘@‘%‘; 查看.
删除用户
命令: DROP USER ‘username‘@‘host‘;
查看mysql的data目录.
show variables like ‘datadir‘;
查看数据的创建脚本.
SHOW CREATE DATABASE Db_UserProfile
检查数据表是否存在.
SELECT table_name FROM information_schema.TABLES WHERE table_name =‘table_398‘;
检查数据表的所有列的定义.
show full columns from userprofile.table_325
修改表名.
ALTER TABLE tb_apiaccount2 RENAME TO tb_apiaccount
忘记密码.
mysql.ini中mysqlld中添加skip-grant-tables跳过权限验证是被注释掉的,去掉注释,重新启动mysql服务.
select * from user;
update user set PASSWORD
=PASSWORD(‘pwd123456‘) where Host
=‘localhost‘; #设置密码为pwd123456
mysql中group_concat(字段名)的返回值被截取导致批量操作失败的问题.
在mysql中的my.ini配置文件中,增加:group_concat_max_len=20480的值,默认是1024,可以根据需求变大.
mysql不支持function.
- mysql> set global log_bin_trust_function_creators = 1;
- 系统启动时 --log-bin-trust-function-creators=1
- 在my.ini(linux下为my.conf)文件中 [mysqld] 标记后加一行内容为 log-bin-trust-function-creators=1
注:设置完成需要重启服务.
mysql分表.
1.)子表必须是MYISAM引擎.//查询 show table status
2.)总表必须是Merge引擎..
3.)总表和子表的结构必须相同..
[注]2017-8-21发现阿里云的rds是不支持MyIsam引擎,因此总表无法正常使用.虽然本地没有问题.//https://bbs.aliyun.com/read/2...
存储过程的常用问题快速排查.
1.插入和更新的字段值不能为null.
2.不能出现未定义的变量.
3.多个列名之间的逗号需要时英文的..
4.插入数据中违反了主键唯一性约束..
5.存储过程和数据表的字段名不一致(中间发生了重命名).
6.传入的变量与实际查询或运算的字段类型不一致..比如传入tinyint, 查询时作为int
7.存在定义了但没赋值(set, select into 等),就直接使用的变量
8.存在字段使用了case when后直接into的情况,正确的做法:case when后需要在包一层内嵌视图,之后再查询字段into
排查的一般过程:首先看有没有违反唯一性约束这些,之后看有没有上述问题(用dbforge)断点观察每个变量...
关于mysql: 连接数限制, too many connections 导致mysql不可用的问题.
1.)保证使用完连接,自动释放.
2.)确保没有for,while循环中构造sql,执行sql的情况.
3.)确保定时服务中的扫描间隔不要太密,工作线程数不要太多(线程需要检测状态自动释放)。
4.)可以利用阿里云rds监控工具,优化索引,减少慢查询,慢查询占用时间长,类似不释放的效果。
5.)适当增大数据库的最大连接数。//阿里云rds.myql默认是300
6.其它参数设置.
wait_timeout=500 //阿里云rds.mysql默认:86400
loose_max_statement_time=15000 //单位:毫秒, 查询的最长耗时间,超过则放弃.. 阿里云rds.mysql默认是0(无限制).
show processlist 得到进程,之后: kill {id}
7.)关于大批量数据导入.
使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入,如果字符串太长,
则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 210241024*10;消耗时间为:11:24:06 11:25:06;
【常用sql写法】
创建唯一索引.
ALTER TABLE DB_User.data ADD UNIQUE (CompanyName) //建立唯一性索引..
之前companyName是varchar(256),提示超过最差限制767,因为256个utf字符就是256X3=768个字节.. (注:gbk是两个字节,ansi是1个字节,utf-8是3个字节).
后来改为varchar(220),开始创建索引..
mysql级联更新.
UPDATE tb_adminuser,
(SELECT agentid,InitAdminUserID FROM tb_agent WHERE agentid=220491) AS tAgentInitAdmin
SET tb_adminuser.RoleID
=200
WHERE
tAgentInitAdmin.InitAdminUserID=tb_adminuser.adminuserid AND tb_adminuser.agentid=220491;
mysql级联删除.
DELETE tb_usersoft FROM tb_usersoft,(SELECT seriessoftid FROM tb_soft WHERE softid=currSoftID) AS tSeries,
(SELECT softid,seriessoftid FROM tb_soft WHERE enabled=1) AS tSoft
WHERE userid=pCommonUserID AND tb_usersoft.SoftId
=tSoft.softid AND tSeries.seriessoftid=tSoft.seriessoftid;
插入时遇到违反重复键则插入(必须有主键或唯一约束的列).
INSERT INTO Top
(Key
, Quantity
, LastWeek
) VALUES(‘关键词‘, 1, 0) ON DUPLICATE KEY UPDATE Quantity
= Quantity
+ 1;
预览初始化数据(对还没初始化的数据查询出来并构造序号,可基于此构造insert).
SET @i=0; #构造序号的初始化处理
SELECT (@i:=@i+1) pm ,CustomerLable,Remark,RootUserID,NOW(),LableType FROM (
SELECT tb_rootuser.RootUserID,RootUserName,CountOfLable FROM tb_rootuser
LEFT JOIN
(SELECT RootUserID, COUNT(*) AS CountOfLable FROM tb_customerlable GROUP BY RootUserID ) AS tLableCount
ON tb_rootuser.RootUserID=tLableCount.RootUserID
WHERE CountOfLable IS NULL ) AS tEmptySettingUser
INNER JOIN
(
SELECT ‘停机或空号‘ AS CustomerLable, ‘客户停机或线索是空号‘ AS Remark,0 AS LableType
UNION
SELECT ‘响铃但未接‘ AS CustomerLable, ‘响铃但未接‘ AS Remark,1 AS LableType
UNION
SELECT ‘接通无意向‘ AS CustomerLable, ‘接通无意向‘ AS Remark,2 AS LableType
UNION
SELECT ‘接通有意向‘ AS CustomerLable, ‘接通有意向‘ AS Remark,3 AS LableType) AS tSystemLable
ON TRUE
ORDER BY RootUserID ASC,LableType ASC;
本文参考自配置啦,原文:Mysql的配置与日常维护sql
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。