当前位置:首页 » 编程语言 » sql刷盘
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql刷盘

发布时间: 2022-04-28 21:29:18

Ⅰ 怎样用命令刷新sql server 中 数据库

命令刷新SQL server 中 数据库:
你提交正常的数据更新后,SQL server 中 数据库,也会自动更新,在你想刷新的时候,重新读取加载一次即可刷新,不需要你额外做什么。

Ⅱ SQL数据磁盘满了怎么解决

-- 清空日志
--压缩日志及数据库文件大小

/*--特别注意
请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.
--*/
select*fromsysfiles
--1.清空日志
DUMPTRANSACTIONusernameWITHNO_LOG

--2.截断事务日志:
BACKUPLOGusernameWITHNO_LOG

--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
-- 企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了

-- 也可以用SQL语句来完成
--收缩数据库
DBCCSHRINKDATABASE(username)

--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select*fromsysfiles

DBCCSHRINKFILE(2)

--4.为了最大化的缩小日志文件(如果是sql7.0,这步只能在查询分析器中进行)
-- a.分离数据库:
-- 企业管理器--服务器--数据库--右键--分离数据库

-- b.在我的电脑中删除LOG文件

-- c.附加数据库:
-- 企业管理器--服务器--数据库--右键--附加数据库

-- 此法将生成新的LOG,大小只有500多K

-- 或用代码:
-- 下面的示例分离username,然后将username中的一个文件附加到当前服务器。

execsp_dboptionusername,'singleuser',true
a.分离
EXECsp_detach_db@dbname='username'

b.删除日志文件
execmaster..xp_cmdshell'delD:\ProgramFiles\SQL\database\username_LOG.ldf'

c.再附加
EXECsp_attach_single_file_db@dbname='username',
@physname='D:\ProgramFiles\SQL\database\username_Data.MDF'

--5.为了以后能自动收缩,做如下设置:
-- 企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"

--SQL语句设置方式:
EXECsp_dboption'数据库名','autoshrink','TRUE'

--6.如果想以后不让它日志增长得太大
-- 企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)

--SQL语句的设置方式:
alterdatabase数据库名modifyfile(name=逻辑文件名,maxsize=20)

Ⅲ sql server 临时表占用硬盘

我们仍然使用两个会话,一个会话 run,用于运行主 SQL;另一个会话 ps,用于进行 performance_schema 的观察:

主会话线程号为 29,

可以看到写入的线程是 page_clean_thread,是一个刷脏操作,这样就能理解数据为什么是慢慢写入的。

也可以看到每个 IO 操作的大小是 16K,也就是刷数据页的操作。


结论:

我们可以看到,

1. MySQL 会基本遵守 max_heap_table_size 的设定,在内存不够用时,直接将表转到磁盘上存储

2. 由于引擎不同(内存中表引擎为 heap,磁盘中表引擎则跟随 internal_tmp_disk_storage_engine 的配置),本次实验写磁盘的数据量和实验 05中使用内存的数据量不同。

3. 如果临时表要使用磁盘,表引擎配置为 InnoDB,那么即使临时表在一个时间很短的 SQL 中使用,且使用后即释放,释放后也会刷脏页到磁盘中,消耗部分 IO。

Ⅳ 如何远程备份MySQL binlog

脚本对远程服务器进行备份的方式,有个缺点:无法对MySQL服务器当前正在写的二进制日志文件进行备份。所以,只能等到MySQL服务器全部写完才能进行备份。而写完一个binlog的时间并不固定,这就导致备份周期的不确定。

从MySQL5.6开始,mysqlbinlog支持将远程服务器上的binlog实时复制到本地服务器上。

mysqlbinlog的实时二进制复制功能并非简单的将远程服务器的日志复制过来,它是通过MySQL 5.6公布的Replication API实时获取二进制事件。本质上,就相当于MySQL的从服务器。与普通服务器类似,主服务器发生事件后,一般都会在0.5~1秒内进行备份。

备份命令

mysqlbinlog--read-from-remote-server--raw--host=192.168.244.145--port=3306--user=repl--password=repl--stop-nevermysql-bin.000001

解释如下:

--read-from-remote-server:用于备份远程服务器的binlog。如果不指定该选项,则会查找本地的binlog。

--raw:binlog日志会以二进制格式存储在磁盘中,如果不指定该选项,则会以文本形式保存。

--user:复制的MySQL用户,只需要授予REPLICATION SLAVE权限。

--stop-never:mysqlbinlog可以只从远程服务器获取指定的几个binlog,也可将不断生成的binlog保存到本地。指定此选项,代表只要远程服务器不关闭或者连接未断开,mysqlbinlog就会不断的复制远程服务器上的binlog。

mysql-bin.000001:代表从哪个binlog开始复制。

除了以上选项外,还有以下几个选项需要注意:

--stop-never-slave-server-id:在备份远程服务器的binlog时,mysqlbinlog本质上就相当于一个从服务器,该选项就是用来指定从服务器的server-id的。默认为-1。

--to-last-log:代表mysqlbinlog不仅能够获取指定的binlog,还能获取其后生成的binlog,获取完了,才终止。如果指定了--stop-never选项则会隐式打开--to-last-log选项。

--result-file:用于设置远程服务器的binlog,保存到本地的前缀。譬如对于mysql-bin.000001,如果指定--result-file=/test/backup-,则保存到本地后的文件名为/test/backup-mysql-bin.000001。注意:如果将--result-file设置为目录,则一定要带上目录分隔符“/”。譬如--result-file=/test/,而不是--result-file=/test,不然保存到本地的文件名为/testmysql-bin.000001。

不足:

这个方式有个问题,对于常规的主从复制来说,如果主从直接的连接断开了,则从会自动再次连接,而对于mysqlbinlog,如果断开了,并不会自动连接。

解决方案:

可通过脚本来弥补上述不足

#!/bin/sh
BACKUP_BIN=/usr/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/backup/binlog/
BACKUP_LOG=/backup/binlog/backuplog
REMOTE_HOST=192.168.244.145
REMOTE_PORT=3306
REMOTE_USER=repl
REMOTE_PASS=repl
FIRST_BINLOG=mysql-bin.000001
#
SLEEP_SECONDS=10
##createlocal_backup_dirifnecessary
mkdir-p${LOCAL_BACKUP_DIR}
cd${LOCAL_BACKUP_DIR}
##运行while循环,连接断开后等待指定时间,重新连接
while:
do
if[`ls-A"${LOCAL_BACKUP_DIR}"|wc-l`-eq0];then
LAST_FILE=${FIRST_BINLOG}
else
LAST_FILE=`ls-l${LOCAL_BACKUP_DIR}|grep-vbackuplog|tail-n1|awk'{print$9}'`
fi
${BACKUP_BIN}--raw--read-from-remote-server--stop-never--host=${REMOTE_HOST}--port=${REMOTE_PORT}--user=${REMOTE_USER}--password=${REMOTE_PASS}${LAST_FILE}
echo"`date+"%Y/%m/%d%H:%M:%S"`mysqlbinlog停止,返回代码:$?"|tee-a${BACKUP_LOG}
echo"${SLEEP_SECONDS}秒后再次连接并继续备份"|tee-a${BACKUP_LOG}
sleep${SLEEP_SECONDS}
done

脚本解读:

1. 实际上定义了一个死循环,如果备份失败,则10s后重新连接。

2. 第一次运行时需指定FIRST_BINLOG的值,指从哪个binlog开始复制,一般为mysql-bin.000001。后续执行的时候就直接获取备份目录下最新的binlog,从最新的binlog开始复制。

总结:

1. 如果指定了--raw,mysqlbinlog获取事件后,并不会实时落盘,而是先保存在本地服务器的内存中,每4K刷盘一次。这也就减少了频繁的日志写操作。如果此时mysqlbinlog和主服务器之间的连接断开了,则内存中的binlog会马上刷新到磁盘中。

2. 尽管mysqlbinlog类似于从服务器,但从服务器上的relaylog却是实时存盘的,即从服务器获取主服务器产生的事件后,会实时写入到relaylog中。

3. 如果不指定--raw,这个时候会以文本格式存盘,此时,--result-file=/test/不能指定为目录,必须明确写上文件名,譬如--result-file=/test/1.sql,此时,mysqlbinlog获取事件后,是实时落盘的,不会每4K刷盘一次。

Ⅳ SQL可以安装在其他盘上吗

没有啊,我就安装在d盘了啊,可以选择的啊,但是在xp下好像是有一个版本是不能装的,企业版或者是个人版忘了。

Ⅵ sql刷选数据库

SELECT * FROM TABLE WHERE X>X1 AND X<X2 AND Y>Y1 AND Y<Y2

Ⅶ mysql插入1000条数据到数据表中如何能加快速度

常用的插入语句如:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)
VALUES ('0', 'userid_0', 'content_0', 0);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)
VALUES ('1', 'userid_1', 'content_1', 1);

修改成:

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)
VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);

修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因是合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。

SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。

Ⅷ 如何优化MySQL insert性能

测试场景

  • MySQL 5.7.12

  • 主要测试 不同刷盘参数 对性能的影响, 使用以下三个场景:

  • sync_binlog=1, innodb_flush_log_at_trx_commit=1, 简写为b1e1 (binlog-1-engine-1)

  • sync_binlog=0, innodb_flush_log_at_trx_commit=1, 简写为b0e1

  • sync_binlog=0, innodb_flush_log_at_trx_commit=0, 简写为b0e0

  • MySQL 环境搭建使用MySQL sandbox, 对应三个场景的启动参数如下:
    1../start --sync-binlog=1 --log-bin=bin --server-id=5712 --gtid-mode=ON --enforce-gtid-consistency=1 --log-slave-updates=1
    2../start --sync-binlog=0 --log-bin=bin --server-id=5712 --gtid-mode=ON --enforce-gtid-consistency=1 --log-slave-updates=1
    3../start --sync-binlog=0 --log-bin=bin --server-id=5712 --gtid-mode=ON --enforce-gtid-consistency=1 --log-slave-updates=1 --innodb-flush-log-at-trx-commit=0

    压力生成使用sysbench:

  • mysql -h127.0.0.1 -P5712 -uroot -pmsandbox -e"truncate table test.sbtest1";

  • /opt/sysbench-0.5/dist/bin/sysbench --test=/opt/sysbench-0.5/dist/db/insert.lua --mysql-table-engine=innodb --mysql-host=127.0.0.1 --mysql-user=root --mysql-password=msandbox --mysql-port=5712 --oltp-table-size=1000000 --mysql-db=test --oltp-table-name=stest --num-threads=1 --max-time=30 --max-requests=1000000000 --oltp-auto-inc=off --db-driver=mysql run

  • 性能观测工具使用systemtap(简称stap), version 2.7/0.160

    基准

    在没有观测压力的情况下, 对三种场景分别进行基准测试, 用以矫正之后测试的误差:

    场景

    sysbench事务数

    b1e1 67546

    b0e1 125699

    b0e0 181612

    火焰图与offcpu

    火焰图

    火焰图是Brendan Gregg首创的表示性能的图形方式, 其可以直观的看到压力的分布. Brendan提供了丰富的工具生成火焰图.

    火焰图比较b0e1和b0e0

    使用stap脚本获取CPU profile, 并生成火焰图(火焰图生成的命令略, 参看Brendan的文档)

    stap脚本

  • global tids

  • probe process("/home/huangyan/sandboxes/5.7.12/bin/mysqld").function("mysql_execute_command") {

  • if (pid() == target() && tids[tid()] == 0) {

  • tids[tid()] = 1;

  • }

  • }


  • global oncpu

  • probe timer.profile {

  • if (tids[tid()] == 1) {

  • oncpu[ubacktrace()] <<< 1;

  • }

  • }


  • probe timer.s(10) {

  • exit();

  • }


  • probe end {

  • foreach (i in oncpu+) {

  • print_stack(i);

  • printf(" %d ", @count(oncpu[i]));

  • }

  • }

  • 注意:
    1. 脚本只抓取MySQL的用户线程的CPU profile, 不抓取后台进程.
    2. 脚本只抓取10s, 相当于对整个sysbench的30s过程进行了短期抽样.

    b0e1生成的火焰图

    性能

    在开启观测的情况下, 观察性能:

    场景

    sysbench事务数

    b0e1 119274

    b0e0 166424

    分析

    在生成的火焰图中, 可以看到:

  • 在b0e1场景中,_ZL27log_write_flush_to_disk_lowv的占比是12.93%, 其绝大部分时间是用于将innodb的log刷盘.

  • 在b0e0场景中,_ZL27log_write_flush_to_disk_lowv的开销被节省掉, 理论上的事务数比例应是1-12.93%=87.07%, 实际事务数的比例是119274/166424=71.67%, 误差较大

  • 误差较大的问题, 要引入offcpu来解决.

    offcpu

    在之前的分析中我们看到理论和实际的事务数误差较大. 考虑_ZL27log_write_flush_to_disk_lowv的主要操作是IO操作, IO操作开始, 进程就会被OS进行上下文切换换下台, 以等待IO操作结束, 那么只分析CPU profile就忽略了IO等待的时间, 也就是说_ZL27log_write_flush_to_disk_lowv的开销被低估了.

    offcpu也是Brendan Gregg提出的概念. 对于IO操作的观测, 除了CPU profile(称为oncpu时间), 还需要观测其上下文切换的代价, 即offcpu时间.

    修改一下stap脚本可以观测offcpu时间. 不过为了将oncpu和offcpu的时间显示在一张火焰图上作对比, 我对于Brendan的工具做了微量修改, 本文将不介绍这些修改.

    stap脚本

  • global tids

  • probe process("/home/huangyan/sandboxes/5.7.12/bin/mysqld").function("mysql_execute_command") {

  • if (pid() == target() && tids[tid()] == 0) {

  • tids[tid()] = 1;

  • }

  • }


  • global oncpu, offcpu, timer_count, first_cpu_id = -1;

  • probe timer.profile {

  • if (first_cpu_id == -1) {

  • first_cpu_id = cpu();

  • }

  • if (tids[tid()] == 1) {

  • oncpu[ubacktrace()] <<< 1;

  • }

  • if (first_cpu_id == cpu()) {

  • timer_count++;

  • }

  • }


  • global switchout_ustack, switchout_timestamp

  • probe scheler.ctxswitch {

  • if (tids[prev_tid] == 1) {

  • switchout_ustack[prev_tid] = ubacktrace();

  • switchout_timestamp[prev_tid] = timer_count;

  • }

  • if (tids[next_tid] == 1 && switchout_ustack[next_tid] != "") {

  • offcpu[switchout_ustack[next_tid]] <<< timer_count - switchout_timestamp[next_tid];

  • switchout_ustack[next_tid] = "";

  • }

  • }


  • probe timer.s(10) {

  • exit();

  • }


  • probe end {

  • foreach (i in oncpu+) {

  • print_stack(i);

  • printf(" %d ", @sum(oncpu[i]));

  • }

  • foreach (i in offcpu+) {

  • printf("---");

  • print_stack(i);

  • printf(" %d ", @sum(offcpu[i]));

  • }

  • }

  • 注意:timer.profile的说明中是这样写的:

  • Profiling timers are available to provide probes that execute on all CPUs at each system tick.


  • 也就是说在一个时间片中,timer.profile会对每一个CPU调用一次. 因此代码中使用了如下代码, 保证时间片技术的正确性:

  • if (first_cpu_id == cpu()) {

  • timer_count++;

  • }

  • b0e1生成的带有offcpu的火焰图

    性能

    由于变更了观测脚本, 需要重新观测性能以减小误差:

    场景

    sysbench事务数

    b0e1 105980

    b0e0 164739

    分析

    在火焰图中, 可以看到:
    1._ZL27log_write_flush_to_disk_lowv的占比为31.23%
    2. 理论上的事务数比例应是1-31.23%=68.77%, 实际事务数的比例是105980/164739=64.33%, 误差较小.

    观测误差的矫正

    在比较b0e1和b0e0两个场景时, 获得了比较好的结果. 但同样的方法在比较b1e1和b0e1两个场景时, 出现了一些误差.

    误差现象

    b1e1的火焰图如图:

    其中_ZN13MYSQL_BIN_LOG16sync_binlog_fileEb(sync_binlog的函数)占比为26.52%.

    但性能差异为:

    场景

    sysbench事务数

    b1e1 53752

    b0e1 105980

    理论的事务数比例为1-26.52%=73.48%, 实际事务数比例为53752/105980=50.71%, 误差较大.

    分析压力分布

    首先怀疑压力转移, 即当sync_binlog的压力消除后, 服务器压力被转移到了其它的瓶颈上. 但如果压力产生了转移, 那么实际事务数比例应大于理论事务数比例, 即sync_binlog=0带来的性能提升更小.

    不过我们还是可以衡量一下压力分布, 看看b1e1和b0e1的压力有什么不同, 步骤如下:

  • 修改stap脚本, 在b1e1中不统计sync_binlog的代价. 生成的火焰图表示消除sync_binlog代价后, 理论上的服务器压力类型.

  • 与b0e1产生的火焰图做比较.

  • stap脚本

    只修改了probe end部分, 略过对my_sync堆栈的统计:

  • probe end {

  • foreach (i in oncpu+) {

  • if (isinstr(sprint_stack(i), "my_sync")) {

  • continue;

  • }

  • print_stack(i);

  • printf(" %d ", @sum(oncpu[i]));

  • }

  • foreach (i in offcpu+) {

  • if (isinstr(sprint_stack(i), "my_sync")) {

  • continue;

  • }

  • printf("---");

  • print_stack(i);

  • printf(" %d ", @sum(offcpu[i]));

  • }

  • }

  • 结果

    b1e1, 理论的服务器压力图:

    b0e1, 实际的服务器压力图:

    可以看到, 压力分布是非常类似, 即没有发生压力分布.

    BTW: 这两张图的类似, 具有一定随机性, 需要做多次试验才能产生这个结果.

    分析

    既然理论和实际的压力分布类似, 那么可能发生的就是压力的整体等比缩小. 推测是两个场景上的观测成本不同, 导致观测影响到了所有压力的观测.

    观察stap脚本, 其中成本较大的是ctxswitch, 即上下文切换时的观测成本.

    上下文切换的观测成本

    如果 “上下文切换的观测成本 影响 场景观测 的公平性” 这一结论成立, 那么我们需要解释两个现象:
    1. b1e1和b0e1的比较, 受到了 上下文切换的观测成本 的影响
    2. b0e1和b0e0的比较, 未受到 上下文切换的观测成本 的影响

    假设 上下文切换的观测成本 正比于 上下文切换的次数, 那么我们只需要:
    1. 观测每个场景的上下文切换次数
    2. 对于b1e1和b0e1的比较, 由上下文切换次数计算得到理论的降速比, 与实际的降速比进行比较
    3. 对于b0e1和b0e0的比较, 由上下文切换次数计算得到是否会带来降速.

    stap脚本

    在probe scheler.ctxswitch和probe end增加了ctxswitch_times相关的内容:

  • global ctxswitch_times

  • probe scheler.ctxswitch {

  • ctxswitch_times++;

  • ...

  • }


  • probe end {

  • ...

  • printf("ctxswitch_times=%d ", ctxswitch_times);

  • }

  • 结果

    场景

    sysbench事务数

    上下文切换次数

    sync_binlog占比

    b1e1 55352 826370 36.80%

    b0e1 105995 693383 –

    b0e0 162709 675092 –

    分析结果:
    1. b1e1与b0e1的比较
    1. 理论降速比:693383/826370 = 83.90%
    2. 实际降速比:(实际的事务数比例/由sync_binlog占比推算的理论的事务数比例) = (55352/105995)/(1-36.80%) = 0.5222/0.6320 = 82.63%
    3. 误差很小. 即b1e1与b0e1的比较中, 理论值和实际值的误差来自于: IO操作的减少导致上下文切换的数量减小, 使得两个场景的观察成本不同.
    2. b0e1与b0e0的比较: 上下文切换次数相近, 即两个场景的观察成本相同.

    实验结果符合之前的分析.

    结论

  • 利用火焰图, 可以快速诊断出MySQL服务器级别的性能瓶颈, 做出合理的参数调整

  • 对于IO类型的操作的观测, 需要考虑oncpu和offcpu两种情况

  • 由于观测手段中使用了上下文切换作为观测点, 那IO操作数量的不同, 会引起上下文切换次数的不同, 从而引起观测误差.

Ⅸ 如何解决主从数据库同步延迟问题

最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave。
mysql-5.6.3已经支持了多线程的主从复制。原理和丁奇的类似,丁奇的是以表做多线程,Oracle使用的是以数据库(schema)为单位做多线程,不同的库可以使用不同的复制线程。
sync_binlog=1
This makes MySQL synchronize the binary log’s contents to disk each time it commits a transaction
默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢 失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘 同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。如果使用InnoDB表,MySQL服务器 处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍 然存在binlog中。可以用--innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。(注释:在MySQL 5.1中不需要--innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),该选项可以提供更大程度的安全,使每个事务的 binlog(sync_binlog =1)和(默认情况为真)InnoDB日志与硬盘同步,该选项的效果是崩溃后重启时,在滚回事务后,MySQL服务器从binlog剪切回滚的 InnoDB事务。这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收 回滚的语句)。
innodb_flush_log_at_trx_commit (这个很管用)
抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。