扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
//最快的方法 10000记录 23MS
鞍山ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
public static void insert() {
// 开时时间
Long begin = new Date().getTime();
// sql前缀
String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES ";
try {
// 保存sql后缀
StringBuffer suffix = new StringBuffer();
// 设置事务为非自动提交
conn.setAutoCommit(false);
// Statement st = conn.createStatement();
// 比起st,pst会更好些
PreparedStatement pst = conn.prepareStatement("");
// 外层循环,总提交事务次数
for (int i = 1; i = 100; i++) {
// 第次提交步长
for (int j = 1; j = 10000; j++) {
// 构建sql后缀
suffix.append("(" + j * i + ", SYSDATE(), " + i * j
* Math.random() + "),");
}
// 构建完整sql
String sql = prefix + suffix.substring(0, suffix.length() - 1);
// 添加执行sql
pst.addBatch(sql);
// 执行操作
pst.executeBatch();
// 提交事务
conn.commit();
// 清空上一次添加的数据
suffix = new StringBuffer();
}
// 头等连接
pst.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
// 结束时间
Long end = new Date().getTime();
// 耗时
System.out.println("cast : " + (end - begin) / 1000 + " ms");
}
首先备份好你本地的数据库,方法如下。 1、用APMServ5.2.6(网站上面有下载)带的phpmyadmin 进行备份恢复。 A、运行APMServ5.2.6, 点击右边的“管理MySql 数据库”。服务器填写127.0.0.1:3306, 登入名称:root,密码为空进行登录。在左边是数据库列表。点击你的数据库。点导出、拉到 最下面把“另存为文件”打勾。点执行。这样你就可以备份你的数据库了。 2、运行mySQL-Front 备份恢复你的数据库。 A、新建一个登录。 信息栏中随便写一下名字。标识你的登录信息。 B、点击连接栏,分别填好: 服务器:服务器的IP 端 口:一般为3306 C、点击注册栏,分别填好: 用 户:你申请的数据库的用户名(如果是本地一般为root), 密 码:数据库的密码(本地为空) 数据库:你申请的数据库名。 填写好这些信息后点击“确定”这样就能链接到你的远程数据库了。左边这个远程数据。 服务器的一些数据库,点击你的数据库后等待链接。直至返回所有数据,你便能打开你的数据库。 中的数据表了。在这里你可以修改你的数据表结构,删除填加数据等(小心操作)。 D、右键点击你的数据库进行备份(输出)数据,有几种备份的类型,一般选sql。
在MySQL 8.0 之前, 我们假设一下有一条烂SQL,
mysqlselect * from t1 order by rand() ;
以多个线程在跑,导致CPU被跑满了,其他的请求只能被阻塞进不来。那这种情况怎么办?
大概有以下几种解决办法:
设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。
自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。
那能不能不要杀掉而让他正常运行,但是又不影响其他的请求呢?
那mysql 8.0 引入的资源组(resource group,后面简写微RG)可以基本上解决这类问题。
比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他继续运行,如果有新的此类语句,让他排队好了。
为什么说基本呢?目前只能绑定CPU资源,其他的暂时不行。
那我来演示下如何使用RG。
创建一个资源组user_ytt. 这里解释下各个参数的含义,
type = user 表示这是一个用户态线程,也就是前台的请求线程。如果type=system,表示后台线程,用来限制mysql自己的线程,比如Innodb purge thread,innodb read thread等等。
vcpu 代表cpu的逻辑核数,这里0-1代表前两个核被绑定到这个RG。可以用lscpu,top等列出自己的CPU相关信息。
thread_priority 设置优先级。user 级优先级设置大于0。
mysqlmysql create resource group user_ytt type = user vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (0.03 sec)
RG相关信息可以从 information_schema.resource_groups 系统表里检索。
mysqlmysql select * from information_schema.resource_groups;+---------------------+---------------------+------------------------+----------+-----------------+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+---------------------+---------------------+------------------------+----------+-----------------+| USR_default | USER | 1 | 0-3 | 0 || SYS_default | SYSTEM | 1 | 0-3 | 0 || user_ytt | USER | 1 | 0-1 | 19 |+---------------------+---------------------+------------------------+----------+-----------------+3 rows in set (0.00 sec)
我们来给语句select guid from t1 group by left(guid,8) order by rand() 赋予RG user_ytt。
mysql show processlist;+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| 4 | event_scheduler | localhost | NULL | Daemon | 10179 | Waiting on empty queue | NULL || 240 | root | localhost | ytt | Query | 101 | Creating sort index | select guid from t1 group by left(guid,8) order by rand() || 245 | root | localhost | ytt | Query | 0 | starting | show processlist |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+3 rows in set (0.00 sec)
找到连接240对应的thread_id。
mysqlmysql select thread_id from performance_schema.threads where processlist_id = 240;+-----------+| thread_id |+-----------+| 278 |+-----------+1 row in set (0.00 sec)
给这个线程278赋予RG user_ytt。没报错就算成功了。
mysqlmysql set resource group user_ytt for 278;Query OK, 0 rows affected (0.00 sec)
当然这个是在运维层面来做的,我们也可以在开发层面结合 MYSQL HINT 来单独给这个语句赋予RG。比如:
mysqlmysql select /*+ resource_group(user_ytt) */guid from t1 group by left(guid,8) order by rand()....8388602 rows in set (4 min 46.09 sec)
RG的限制:
Linux 平台上需要开启 CAPSYSNICE 特性。比如我机器上用systemd 给mysql 服务加上
systemctl edit mysql@80 [Service]AmbientCapabilities=CAP_SYS_NICE
mysql 线程池开启后RG失效。
freebsd,solaris 平台thread_priority 失效。
目前只能绑定CPU,不能绑定其他资源。
1、打开数据库配置文件my.ini
(一般在数据库安装目录)(D:\MYSQL)
2、在数据库的最后一行添加
log=log.txt
代码
3、重启mysql数据库
4、去数据库数据目录
我的是(D:\MYSQL\data)
你会发现多了一个log.txt文件
我的是在C:\Documents
and
Settings\All
Users\Application
Data\MySQL\MySQL
Server
5.5\data
测试:
1、对数据库操作
2、查看log.txt文件内容
如果发现有变化说明你就可以监控到mysql数据库的变化
数据库的查询
删除
更新
插入都可以查到
希望本篇文章可以帮助大家更快的二次开发
^_^
日志文件类型概述:
1.
错误日志
记录启动、运行或停止mysqld时出现的问题。
My.ini配置信息:
#Enter
a
name
for
the
error
log
file.
Otherwise
a
default
name
will
be
used.
#log-error=d:/mysql_log_err.txt
1、导入.sql文件命令:mysql USE 数据库名;mysql source d:/mysql.sql;
2、建立数据库:mysql CREATE DATABASE 库名;
3、建立数据表:mysql USE 库名;mysql CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));
4、删除数据库:mysql DROP DATABASE 库名;
5、删除数据表:mysql DROP TABLE 表名;
6、将表中记录清空:mysql DELETE FROM 表名;
7、往表中插入记录:mysql INSERT INTO 表名 VALUES ("hyq","M");
8、更新表中数据:mysql- UPDATE 表名 SET 字段名1='a',字段名2='b' WHERE 字段名3='c';
9、用文本方式将数据装入数据表中:mysql load data local infile "d:/mysql.txt" into table 表名;
一种更正方式是使用“--tmpdir”选项启动mysqld,或在选项文件的[mysqld]部分增加该选项。例如,要想指定目录C:emp,可使用:
[mysqld]
tmpdir=C:/temp
目录C:emp必须存在,并有足够的空间允许MySQL写入它。请参见4.3.2节,“使用选项文件”。
该错误的另一个原因可能是许可事宜。请确认MySQL服务器能够写入tmpdir目录。
此外,还用使用perror检查错误代码。服务器无法写入表的一个原因是文件系统已满。
shell perror 28
错误代码28:磁盘上无剩余空间
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流