• 关于

    数据转换程序无法连接

    的搜索结果

回答

您好, 云数据库 RDS 版-云服务器如何通过内网访问RDS? 云服务器公网带宽一般都是有限的。如果通过云服务器的公网网卡访问RDS,则往往会受带宽限制,导致整个系统性能很慢。 因此我们建议您通过云服务器的内网网卡访问RDS,从RDS控制台切换内网的方法如下: 1)在高安全访问模式下,支持内外网同时存在,您只需在RDS控制台单击申请内网地址即可; 2)在高性能访问模式下,只支持一种连接地址,您只需在RDS控制台单击申请内网地址,即可切换到内网地址,同时释放外网连接地址;    请注意增加内网连接后,如您的连接地址有变更,您的应用程序需要修改数据库的连接地址,并且需要重启应用程序。否则您的应用程序将无法访问RDS。 如问题还未解决,请联系售后技术支持。 相关参考:为什么 ECS 连接不上 Redis? 两者通过内网连接必须满足的条件如下: ECS 和 Redis 在相同的地域 ECS 和 Redis 在相同的网络环境,即:必须都属于经典网络或者同一个 VPC 下 ECS 内网 IP 在 Redis 白名单中 以下情况中,ECS 无法直接通过内网连接 Redis 数据库。 如果您的 ECS 和 redis 在不同地域的 VPC 中,内网是不通的。在不同地域下的 ECS 连接 Redis,目前只能通过高速通道实现跨 VPC 的内网访问,详情参见跨地域 VPC 互连。 如果您的 ECS 和 redis 属于不同的网络类型,您可以通过如下方法来解决: 如果可以接受转换为 VPC 网络类型,请参考切换为专有网络或者迁移方案概述。 如果不接受转化为 VPC,您需要重新购买同一地域下、同属经典网络的 ECS 和 Redis。

微wx笑 2019-12-01 23:47:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 随着业务的增长,您的数据盘容量可能无法满足数据存储的需要,这时您可以使用 磁盘扩容 功能扩容数据盘。 说明 建议在扩容数据盘之前手动创建快照,以备份数据。 无论数据盘的状态是 待挂载 还是 使用中,都可以执行磁盘扩容操作。 如果数据盘正在创建快照,则不允许执行扩容数据盘的操作。 包年包月实例如果做过 续费降配 操作,当前计费周期的剩余时间内,实例上的包年包月云盘不支持扩容磁盘操作。 扩容磁盘只是扩大数据盘容量,而不是扩容文件系统。 磁盘扩容只能扩容数据盘,不能扩容系统盘或本地盘(本地 SSD 盘等)。 挂载在实例上的数据盘,只有当实例处于 运行中 (Running) 或 已停止(Stopped) 状态时才可以扩容。扩容这种数据盘需要在控制台上重启实例后才能使扩容后的容量生效,而重启实例会使您的实例停止工作,从而中断您的业务,所以请您谨慎操作。 本文以一个高效云盘的数据盘和一个运行Windows Server 2008 R2企业版64位中文版的ECS实例为例,说明如何扩容数据盘并使扩容后的容量可用。示例中最初的磁盘大小为24 GiB,我们将其扩容到26 GiB。 您可以按以下步骤完成扩容操作: 步骤 1. 在控制台上扩容数据盘 步骤 2. 登录实例完成扩容 步骤 1. 在控制台上扩容数据盘 按以下步骤在控制台上扩容数据盘: 登录 ECS管理控制台。 在左侧导航栏里,选择 存储 > 云盘。 说明 如果您需要扩容的数据盘已经挂载在某个实例上,您可以单击 实例,找到相应实例后,进入实例详情页,并单击 本实例磁盘。 选择地域。 找到需要扩容的磁盘,并在 操作 列中,选择 更多 > 磁盘扩容。 在 磁盘扩容 页面上,设置 扩容后容量。在本示例中为26 GiB。扩容后容量只能比当前容量大。 待页面上显示费用信息后,单击 确定扩容。 说明 扩容成功后,磁盘列表里即显示扩容后的容量。但是,如果您的数据盘已经挂载到实例上,您需要在控制台上 重启实例 后,登录实例才能看到扩容后的数据盘容量。 在控制台上完成扩容后, 如果数据盘已经挂载到实例,可以直接执行 步骤 2. 登录实例完成扩容。 如果数据盘未挂载到实例上,您应先挂载数据盘(详见 挂载云盘),再根据数据盘的实际情况执行不同的操作: 如果这是一个全新的数据盘,您可以直接格式化数据盘。详见 Windows 格式化数据盘。 如果这个数据盘之前已经格式化并分区,您需要执行 步骤 2. 登录实例完成扩容。 步骤 2. 登录实例完成扩容 按以下步骤在实例内部完成数据盘扩容: 使用软件连接Windows实例。 在Windows Server桌面,单击服务器管理器图标 。 在 服务器管理器 的左侧导航窗格里,选择 存储 > 磁盘管理。在磁盘管理区域,可以看到新增的数据盘空间与旧的数据盘空间之间的关系。本例中,磁盘 2 是扩容的数据盘。 右键单击 磁盘 2,选择 转换到动态磁盘,并按页面提示将基本磁盘转换为动态磁盘。 说明 基本磁盘转换成动态磁盘,操作的过程中会将磁盘从系统中卸载下来。如果数据盘内安装了应用程序,转换过程中这些应用程序暂时无法使用。转换过程中不会造成数据丢失。 完成转换后,磁盘 2 在磁盘管理器中显示如下。 右键单击磁盘 2的简单卷的任一空白处,并选择 扩展卷。 根据 扩展卷向导 的指示完成扩展卷操作。完成后,新增的数据盘空间会自动合入原来的卷中,磁盘 2 在磁盘管理器中显示如下。 说明 如果是Windows Server 2003,完成后新增的数据盘空间会自动增加到数据盘中,但是在磁盘管理器中,新增的数据盘空间会以一个独立卷的形式存在。Windows Server 2003中,扩容多少次就会有创建多少个独立的卷,不会将所有的卷都合并到之前的卷里面,但并不会影响实际使用。以下是一个Windows Server 2003系统里扩容后数据盘的显示信息。 至此,您已经完成了扩容数据盘。

2019-12-01 22:56:53 0 浏览量 回答数 0

回答

4字节Unicode字符尚未得到广泛使用,因此并不是每个应用程序都完全支持它们。正确配置后,MySQL 5.5可以很好地使用4字节字符-检查您的其他组件是否也可以使用它们。 还有其他一些要检查的内容: 除了设置客户端和服务器字符集(例如ALTER TABLE mytable charset=utf8mb4, MODIFY COLUMN textfield1 VARCHAR(255) CHARACTER SET utf8mb4,MODIFY COLUMN textfield2 VARCHAR(255) CHARACTER SET utf8mb4;,等等)之外,确保所有表的默认字符集和文本字段都转换为utf8mb4 。 如果您的数据已经在utf8字符集中,则应将其转换为utf8mb4,而不会出现任何问题。与往常一样,请先备份数据,然后再尝试! 还要确保您的应用程序层将其数据库连接的字符集设置为utf8mb4。请仔细检查这是否确实在发生–如果您运行的是所选框架的mysql客户端库的旧版本,则可能未使用utf8mb4支持对其进行编译,因此无法正确设置字符集。如果没有,您可能必须自己对其进行更新或编译。 通过mysql客户端查看数据时,请确保您所在的计算机可以显示表情符号,并SET NAMES utf8mb4在运行任何查询之前运行。 一旦您的应用程序的每个级别都可以支持新字符,您就应该能够使用它们而不会出现任何损坏来源:stack overflow

保持可爱mmm 2020-05-10 23:12:18 0 浏览量 回答数 0

Quick BI 数据可视化分析平台

2020年入选全球Gartner ABI魔力象限,为中国首个且唯一入选BI产品

回答

具体数字代表的含义如下: 600 某操作处于挂起状态。 601 检测到一个无效端口句柄。 602 指定端口已经打开。 603 呼叫方缓冲区太小。 604 指定了错误的信息。 605 无法设置端口信息。 606 无法连接指定端口。 607 检测到无效事件。 608 指定了一个不存在的设备。 609 设备类型不存在。 610 缓冲区无效。 611 路由不可用。 612 路由没有分配。 613 指定了无效的压缩。 614 缓冲区不足。 615 没有找到端口。 616 某异步请求处于挂起状态。 617 端口或设备已经断开。 618 端口没有打开。 619 不能建立到远程计算机的连接,因此用于此连接的端口已关闭。 620 没有端点。 621 无法打开电话簿文件。 622 无法加载电话簿文件。 623 无法找到电话簿项。 624 无法写入电话簿文件。 625 在电话簿中发现的无效信息。 626 无法加载字符串。 627 无法找到键。 628 在连接完成之前,连接被远程计算机终止。 629 数据链接被远程计算机终止。 630 由于硬件失败,端口断开连接。 631 用户已断开端口连接。 632 结构大小不正确。 633 端口已经在使用或没有为“远程访问”拨出配置端口。 634 无法在远程网络注册计算机。 635 未知错误。 636 错误的设备连接到端口。 637 字符串无法转换。 638 请求超时。 639 没有可用的异步网络。 640 发生 NetBIOS 错误。 641 服务器无法分配支持客户端所需的 NetBIOS 资源。 642 已在远程网络上注册了一个 NetBIOS 名称。 643 服务器上的网络适配器出现故障。 644 将无法接收网络弹出式消息。 645 内部身份验证错误。 646 不允许此帐户在一天的这一时间段登录。 647 本帐户已禁用。 648 密码已过期。 649 帐户没有“远程访问”的权限。 650 “远程访问”服务器没有响应。 651 调制解调器(或其他设备)报告了一个错误。 652 设备响应无法识别。 653 没有在设备 .INF 文件部分发现设备所必需的宏。 654 设备 .INF 文件部分中的命令或响应引用到未定义的宏。 655 在设备 .INF 文件部分未发现 宏。 656 在设备 .INF 文件部分中的 宏含有未定义的宏。 657 无法打开设备 .INF 文件。 658 设备 .INF 文件或媒体 .INI 文件中的设备名太长。 659 媒体 .INI 文件引用了未知的设备名。 660 设备 .INF 文件不包含对该命令的响应。 661 设备 .INF 文件缺少一条命令。 662 试图设置一个没有列在设备 .INF 文件部分的宏。 663 媒体 .INI 文件引用了未知的设备类型。 664 无法分配内存。 665 端口不是为“远程访问”配置的。 666 调制解调器(或其他设备)不起作用。 667 无法读取媒体 .INI 文件。 668 连接已除去。 669 媒体 .INI 文件中的用法参数无效。 670 不能从媒体 .INI 文件中读取部分名称。 671 不能从媒体 .INI 文件中读取设备类型。 672 不能从媒体 .INI 文件中读取设备名称。 673 不能从媒体 .INI 文件中读取使用方法。 674 不能从媒体 .INI 文件中读取最大连接 BPS 速率。 675 不能从媒体 .INI 文件中读取最大载波 BPS 速率。 676 线路忙。 677 人工应答而不是调制解调器应答。 678 远程计算机没有响应。 679 无法检测载波。 680 没有拨号音。 681 设备报告的常见错误。 691 拒绝访问,因为用户名和/或密码在域中无效。 692 端口或连接的设备内的硬件故障。 695 未启动状态机器。 696 已启动状态机器。 697 响应循环未完成。 699 设备响应引起缓冲区溢出。 700 设备 .INF 文件中的扩展命令太长。 701 设备移动到 COM 驱动程序不支持的 BPS 速率。 703 连接需要用户信息,但应用程序不允许用户交互。 704 回拨号码无效。 705 授权状态无效。 707 出现与 X.25 协议有关的错误。 708 本帐户已过期。 709 在域中修改密码的错误。 710 与调制解调器通信时检测到串口超载错误。 711 在此计算机上的配置错误阻止此连接。 712 Biplex 端口正在初始化。等几秒钟再重拨。 713 没有活动的 ISDN 线路可用。 714 没有足够的 ISDN 通道可用于呼叫。 715 电话线质量太差而产生了太多的错误。 716 “远程访问 IP”配置不能用。 717 在“远程访问 IP”地址的静态池中没有可用的 IP 地址。 718 因为远程计算机没有及时反应,此连接已被终止。 719 PPP 已被远程计算机终止。 720 无法建立与远程计算机的连接。可能需要更改此连接的网络设置。 721 远程计算机没响应。 722 PPP 数据包无效。 723 电话号码(包含前缀及后缀在内)太长。 726 不能同时将 IPX 协议用于多个端口的拨出。 728 找不到连接到“远程访问”的 IP 适配器。 729 只有在安装了 IP 协议之后,才能使用 SLIP。 731 未配置协议。 732 PPP 协商没有会合。 733 不能完成到远程计算机的连接。 734 PPP 链接控制协议被终止。 735 请求的地址被服务器拒绝。 736 远程计算机终止了控制协议。 737 检测到环回。 738 服务器没指定地址。 739 远程服务器不能使用加密的密码。 740 为“远程访问”配置的 TAPI 设备无法初始化或没有正确安装。 741 本地计算机不支持加密。 742 远程服务器不支持加密。 743 远程服务器要求加密。 752 处理脚本时遇到语法错误。

元芳啊 2019-12-02 00:44:12 0 浏览量 回答数 0

回答

错误(error )是指人们在使用软、硬件的时候,软、硬件不能正常操作的一种现象。由于错误的类型很多,为了对错误进行区分,系统设定了错误代码(error code),软、硬件在运行中如果发生错误,将通过它内部的原有的设定判断、识别而通过错误代码的显示方式给操作者,操作者通过错误代码识别,快速找到软、硬件不能正常操作的具体原因。windows错误代码列举1100 已经到达磁带的物理尽头。1101 磁带访问到文件标记。1102 到达磁带或分区首部。1103 磁带访问到文件组的末尾。1104 磁带上没有其他数据。1105 磁带无法分区。1106 访问多重卷分区的新磁带时,当前的区块大小不正确。1107 加载磁带时,找不到磁带分区信息。1108 无法锁定媒体退出功能。1109 无法卸载媒体。1110 驱动器中的媒体已经更改。1111 已经复位I/O 总线。1112 驱动器中没有媒体。1113 在目标多字节代码页中不存在对单码字符的映射。1114 动态链接库 (DLL) 初始化例程失败。1115 正在关闭系统。1116 无法终止系统关机,因为没有进行中的关机操作。1117 由于 I/O 设备出现错误,无法运行该请求。1118 串行设备初始化失败。将卸载串行驱动程序。1119 无法打开正与其他设备共享中断请求 (IRQ) 的设备。至少有一个使用该 IRQ 的设备已经打开。1120 由于再次写入串行口,串行 I/O 操作已结束。(IOCTL_SERIAL_XOFF_COUNTER 为零。)1121 由于超时,串行 I/O 操作已结束。 (IOCTL_SERIAL_XOFF_COUNTER 未达到零。)1122 在软盘上找不到标识符地址标记。1123 软盘扇区标识符字段与软盘控制器磁道地址不匹配。1124 软盘控制器报告软盘驱动程序不能识别的错误。1125 软盘控制器返回的结果和注册的不一致。1126 访问硬盘时,再校准操作失败,再试一次后也无法操作。1127 访问硬盘时,磁盘操作失败,再试一次后仍没有作用。1128 访问硬盘时,需要重启动磁盘控制器,但仍未成功。1129 磁带已卷到尽头。1130 可用的服务器存储区不足,无法执行该命令。1131 检测到潜在的死锁情况。1132 指定的基址或文件偏移量没有正确对齐。1140 试图更改系统电源状态的操作被另一应用程序或驱动程序禁止。1141 系统 BIOS 无法更改系统电源状态。1142 试图在一文件上创建超过系统允许数额的链接。1150 指定的程序需要新的 Windows 版本。1151 指定的程序不是 Windows 或 MS-DOS 程序。1152 无法启动指定程序的多个实例。1153 指定的程序是为 Windows 的早期版本编写的。1154 运行此应用程序所需的某个库文件已损。1155 没有应用程序与该操作中所指定的文件关联。1156 将命令发送到应用程序时出现错误。1157 找不到运行此应用程序所需的某个库文件。1158 当前进程已使用了 Window 管理器对象的系统允许的所有句柄。1159 消息只能与同步操作一起使用。1160 指出的源元素没有媒体。1161 指出的目标元素已包含媒体。1162 指出的元素不存在。1163 指出的元素是未显示的存储资源的一部分。1164 指出的设备需要重新初始化,因为硬件有错误。1165 设备显示在尝试进一步操作之前需要清除。1166 设备显示它的门仍是打开状态。1167 设备没有连接。1168 找不到元素。1169 索引中没有同指定项相匹配的项。1170 在对象上不存在指定的属性集。1171 传递到 GetMouseMovePoints 的点不在缓冲区中。1172 跟踪(工作站)服务没运行。1173 找不到卷 ID。1175 无法删除要被替换的文件。1176 无法将替换文件移到要被替换的文件。要被替换的文件保持原来的名称。1177 无法将替换文件移到要被替换的文件。要被替换的文件已被重新命名为备份名称。1178 卷更改记录被删除。1179 卷更改记录服务不处于活动中。1180 找到一份文件,但是可能不是正确的文件。1181 日志项已从日志中删除。1200 指定的设备名无效。1201 设备当前虽然未连接,但它是记忆连接。1202 试图记起已经记住的设备。1203 网络供应商不接受给定的网络路径。1204 指定的网络供应商名无效。1205 无法打开网络连接配置文件。1206 网络连接配置文件已损坏。1207 无法列举非包容类。1208 出现扩展错误。1209 指定组名的格式无效。1210 指定计算机名的格式无效。1211 指定事件名的格式无效。1212 指定域名的格式无效。1213 指定服务名的格式无效。1214 指定网络名的格式无效。1215 指定共享名的格式无效。1216 指定密码的格式无效。1217 指定的邮件名无效。1218 指定邮件目的地的格式无效。1219 所提供的凭据与现有凭据设置冲突。1220 试图与网络服务器建立会话,但与该服务器建立的会话太多。1221 网络上的其他计算机已经使用该工作组或域名。1222 网络不存在或者没有启动。1223 用户已经取消该操作。1224 所要求的操作无法在已经打开用户映射区域的文件中运行。1225 远程系统拒绝网络连接。1226 已经关闭网络连接。1227 网络传输的终点已经有一个地址与其关联。1228 网络终点尚未与地址关联。1229 试图在不存在的网络连接中操作。1230 试图在活动的网络连接上进行无效操作。1231-1233不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。1234 远程系统的目标网络端点没有运行任何服务。1235 该请求已经终止。1236 本地系统已经终止网络连接。1237 无法完成操作。请再试一次。1238 无法创建到该服务器的连接,因为已经到达了该帐户同时连接的最大数目。1239 试图在该帐户未授权的时间内登录。1240 尚未授权此帐户从该站登录网络。1241 网络地址无法用于要求的操作。1242 服务已经注册。1243 指定的服务不存在。1244 由于尚未验证用户身份,无法执行要求的操作。1245 由于用户尚未登录网络,无法运行要求的操作。指定的服务不存在。1246 继续工作。1247 完成初始化操作后,试图再次运行初始化操作。1248 没有其他本地设备。1249 指定的站点不存在。1250 具有指定名称的域控制器已经存在。1251 只有连接到服务器上时,才支持该操作。1252 即使没有改动,组策略框架也应该调用扩展。1253 指定的用户没有一个有效的配置文件。1254 Microsoft Small Business Server 不支持此操作。1300 不是对所有的调用方分配引用特权。1301 帐户名与安全标识符之间的映射未完成。1302 没有为该帐户明确地设置系统配额限制。1303 没有可用的密钥。返回已知的密钥。1304 密码太复杂,无法转换成 LAN Manager 密码。返回的 LAN Manager 密码是空字符串。1305 修订级别未知。1306 表示两个修订级别不兼容。1307 无法将此安全标识符指定为该对象的拥有者。1308 无法将此安全标识符指定为主要的对象组。1309 当前并未模拟客户的线程试图操作模拟令牌。1310 不可以禁用该组。1311 没有可用的登录服务器处理登录请求。1312 指定的登录会话不存在。该会话可能已终止。1313 指定的权限不存在。1314 客户不保留请求的权限。1315 提供的名称不是正确的帐户名称格式。1316 指定的用户已经存在。1317 指定的用户不存在。1318 指定的组已经存在。1319 指定的组不存在。1320 或者指定的用户帐户已经是某个特定组的成员,或者也可能指定的组非空而不能被删除。1321 指定的用户帐户不是所指定组帐户的成员。1322 上次保留的管理帐户无法关闭或删除。1323 无法更新密码。所输入的密码不正确。1324 无法更新密码。所提供的新密码包含不可用于密码的值。1325 无法更新密码。为新密码提供的值不符合字符域的长度、复杂性或历史要求。1326 登录失败: 用户名未知或密码错误。1327 登录失败: 用户帐户限制。1328 登录失败: 违反帐户登录时间限制。1329 登录失败: 禁止用户登录到该计算机上。1330 登录失败: 指定的帐户密码已过期。1331 登录失败: 当前禁用帐户。1332 未完成帐户名与安全性标识符之间的映射。1333 一次请求的本地用户标识符(LUID)太多。1334 没有其他可用的本地用户标识符(LUID)。1335 对这个特定使用来说,安全标识符的子部分是无效的。1336 访问控制清单(ACL)结构无效。1337 安全标识符结构无效。1338 安全描述符结构无效。1340 无法创建继承的访问控制列表(ACL)或访问控制项目(ACE)。1341 当前已禁用服务器。1342 当前已启用服务器。1343 所提供的值是无效的标识符授权值。1344 没有更多的内存用于更新安全信息。1345 指定的属性无效,或指定的属性与整个组的属性不兼容。1346 或者没有提供所申请的模仿级别,或者提供的模仿级别无效。1347 无法打开匿名级安全性符号。1348 所请求的验证信息类别无效。1349 该类符号不能以所尝试的方式使用。1350 无法在没有相关安全性的对象上运行安全操作。1351 未能从域控制器读取配置信息,或者是因为机器不可使用,或者是访问被拒绝。 错误(error )是指人们在使用软、硬件的时候,软、硬件不能正常操作的一种现象。由于错误的类型很多,为了对错误进行区分,系统设定了错误代码(error code),软、硬件在运行中如果发生错误,将通过它内部的原有的设定判断、识别而通过错误代码的显示方式给操作者,操作者通过错误代码识别,快速找到软、硬件不能正常操作的具体原因。windows错误代码列举1100 已经到达磁带的物理尽头。1101 磁带访问到文件标记。1102 到达磁带或分区首部。1103 磁带访问到文件组的末尾。1104 磁带上没有其他数据。1105 磁带无法分区。1106 访问多重卷分区的新磁带时,当前的区块大小不正确。1107 加载磁带时,找不到磁带分区信息。1108 无法锁定媒体退出功能。1109 无法卸载媒体。1110 驱动器中的媒体已经更改。1111 已经复位I/O 总线。1112 驱动器中没有媒体。1113 在目标多字节代码页中不存在对单码字符的映射。1114 动态链接库 (DLL) 初始化例程失败。1115 正在关闭系统。1116 无法终止系统关机,因为没有进行中的关机操作。1117 由于 I/O 设备出现错误,无法运行该请求。1118 串行设备初始化失败。将卸载串行驱动程序。1119 无法打开正与其他设备共享中断请求 (IRQ) 的设备。至少有一个使用该 IRQ 的设备已经打开。1120 由于再次写入串行口,串行 I/O 操作已结束。(IOCTL_SERIAL_XOFF_COUNTER 为零。)1121 由于超时,串行 I/O 操作已结束。 (IOCTL_SERIAL_XOFF_COUNTER 未达到零。)1122 在软盘上找不到标识符地址标记。1123 软盘扇区标识符字段与软盘控制器磁道地址不匹配。1124 软盘控制器报告软盘驱动程序不能识别的错误。1125 软盘控制器返回的结果和注册的不一致。1126 访问硬盘时,再校准操作失败,再试一次后也无法操作。1127 访问硬盘时,磁盘操作失败,再试一次后仍没有作用。1128 访问硬盘时,需要重启动磁盘控制器,但仍未成功。1129 磁带已卷到尽头。1130 可用的服务器存储区不足,无法执行该命令。1131 检测到潜在的死锁情况。1132 指定的基址或文件偏移量没有正确对齐。1140 试图更改系统电源状态的操作被另一应用程序或驱动程序禁止。1141 系统 BIOS 无法更改系统电源状态。1142 试图在一文件上创建超过系统允许数额的链接。1150 指定的程序需要新的 Windows 版本。1151 指定的程序不是 Windows 或 MS-DOS 程序。1152 无法启动指定程序的多个实例。1153 指定的程序是为 Windows 的早期版本编写的。1154 运行此应用程序所需的某个库文件已损。1155 没有应用程序与该操作中所指定的文件关联。1156 将命令发送到应用程序时出现错误。1157 找不到运行此应用程序所需的某个库文件。1158 当前进程已使用了 Window 管理器对象的系统允许的所有句柄。1159 消息只能与同步操作一起使用。1160 指出的源元素没有媒体。1161 指出的目标元素已包含媒体。1162 指出的元素不存在。1163 指出的元素是未显示的存储资源的一部分。1164 指出的设备需要重新初始化,因为硬件有错误。1165 设备显示在尝试进一步操作之前需要清除。1166 设备显示它的门仍是打开状态。1167 设备没有连接。1168 找不到元素。1169 索引中没有同指定项相匹配的项。1170 在对象上不存在指定的属性集。1171 传递到 GetMouseMovePoints 的点不在缓冲区中。1172 跟踪(工作站)服务没运行。1173 找不到卷 ID。1175 无法删除要被替换的文件。1176 无法将替换文件移到要被替换的文件。要被替换的文件保持原来的名称。1177 无法将替换文件移到要被替换的文件。要被替换的文件已被重新命名为备份名称。1178 卷更改记录被删除。1179 卷更改记录服务不处于活动中。1180 找到一份文件,但是可能不是正确的文件。1181 日志项已从日志中删除。1200 指定的设备名无效。1201 设备当前虽然未连接,但它是记忆连接。1202 试图记起已经记住的设备。1203 网络供应商不接受给定的网络路径。1204 指定的网络供应商名无效。1205 无法打开网络连接配置文件。1206 网络连接配置文件已损坏。1207 无法列举非包容类。1208 出现扩展错误。1209 指定组名的格式无效。1210 指定计算机名的格式无效。1211 指定事件名的格式无效。1212 指定域名的格式无效。1213 指定服务名的格式无效。1214 指定网络名的格式无效。1215 指定共享名的格式无效。1216 指定密码的格式无效。1217 指定的邮件名无效。1218 指定邮件目的地的格式无效。1219 所提供的凭据与现有凭据设置冲突。1220 试图与网络服务器建立会话,但与该服务器建立的会话太多。1221 网络上的其他计算机已经使用该工作组或域名。1222 网络不存在或者没有启动。1223 用户已经取消该操作。1224 所要求的操作无法在已经打开用户映射区域的文件中运行。1225 远程系统拒绝网络连接。1226 已经关闭网络连接。1227 网络传输的终点已经有一个地址与其关联。1228 网络终点尚未与地址关联。1229 试图在不存在的网络连接中操作。1230 试图在活动的网络连接上进行无效操作。1231-1233不能访问网络位置。有关网络疑难解答的信息,请参阅 Windows 帮助。1234 远程系统的目标网络端点没有运行任何服务。1235 该请求已经终止。1236 本地系统已经终止网络连接。1237 无法完成操作。请再试一次。1238 无法创建到该服务器的连接,因为已经到达了该帐户同时连接的最大数目。1239 试图在该帐户未授权的时间内登录。1240 尚未授权此帐户从该站登录网络。1241 网络地址无法用于要求的操作。1242 服务已经注册。1243 指定的服务不存在。1244 由于尚未验证用户身份,无法执行要求的操作。1245 由于用户尚未登录网络,无法运行要求的操作。指定的服务不存在。1246 继续工作。1247 完成初始化操作后,试图再次运行初始化操作。1248 没有其他本地设备。1249 指定的站点不存在。1250 具有指定名称的域控制器已经存在。1251 只有连接到服务器上时,才支持该操作。1252 即使没有改动,组策略框架也应该调用扩展。1253 指定的用户没有一个有效的配置文件。1254 Microsoft Small Business Server 不支持此操作。1300 不是对所有的调用方分配引用特权。1301 帐户名与安全标识符之间的映射未完成。1302 没有为该帐户明确地设置系统配额限制。1303 没有可用的密钥。返回已知的密钥。1304 密码太复杂,无法转换成 LAN Manager 密码。返回的 LAN Manager 密码是空字符串。1305 修订级别未知。1306 表示两个修订级别不兼容。1307 无法将此安全标识符指定为该对象的拥有者。1308 无法将此安全标识符指定为主要的对象组。1309 当前并未模拟客户的线程试图操作模拟令牌。1310 不可以禁用该组。1311 没有可用的登录服务器处理登录请求。1312 指定的登录会话不存在。该会话可能已终止。1313 指定的权限不存在。1314 客户不保留请求的权限。1315 提供的名称不是正确的帐户名称格式。1316 指定的用户已经存在。1317 指定的用户不存在。1318 指定的组已经存在。1319 指定的组不存在。1320 或者指定的用户帐户已经是某个特定组的成员,或者也可能指定的组非空而不能被删除。1321 指定的用户帐户不是所指定组帐户的成员。1322 上次保留的管理帐户无法关闭或删除。1323 无法更新密码。所输入的密码不正确。1324 无法更新密码。所提供的新密码包含不可用于密码的值。1325 无法更新密码。为新密码提供的值不符合字符域的长度、复杂性或历史要求。1326 登录失败: 用户名未知或密码错误。1327 登录失败: 用户帐户限制。1328 登录失败: 违反帐户登录时间限制。1329 登录失败: 禁止用户登录到该计算机上。1330 登录失败: 指定的帐户密码已过期。1331 登录失败: 当前禁用帐户。1332 未完成帐户名与安全性标识符之间的映射。1333 一次请求的本地用户标识符(LUID)太多。1334 没有其他可用的本地用户标识符(LUID)。1335 对这个特定使用来说,安全标识符的子部分是无效的。1336 访问控制清单(ACL)结构无效。1337 安全标识符结构无效。1338 安全描述符结构无效。1340 无法创建继承的访问控制列表(ACL)或访问控制项目(ACE)。1341 当前已禁用服务器。1342 当前已启用服务器。1343 所提供的值是无效的标识符授权值。1344 没有更多的内存用于更新安全信息。1345 指定的属性无效,或指定的属性与整个组的属性不兼容。1346 或者没有提供所申请的模仿级别,或者提供的模仿级别无效。1347 无法打开匿名级安全性符号。1348 所请求的验证信息类别无效。1349 该类符号不能以所尝试的方式使用。1350 无法在没有相关安全性的对象上运行安全操作。1351 未能从域控制器读取配置信息,或者是因为机器不可使用,或者是访问被拒绝。

1652919821114713 2019-12-02 00:43:41 0 浏览量 回答数 0

回答

您所拥有的EXTRATERRESTRIAL ALIEN (U+1F47D)和BROKEN HEART (U+1F494)不属于基本的多语言平台。他们不能在Java作为一个字符来表示,甚至,"".length() == 4。它们绝对不是空字符,如果您不使用支持它们的字体,则会看到正方形。 MySQL的utf8只支持基本多文种平面,你需要使用utf8mb4,而不是: 对于补充字符,utf8根本无法存储该字符,而utf8mb4需要四个字节来存储它。由于utf8根本无法存储字符,因此在utf8列中没有任何补充字符,并且在从旧版MySQL升级utf8数据时,您不必担心转换字符或丢失数据。 因此,要支持这些字符,您的MySQL必须为5.5+,并且需要在utf8mb4任何地方使用。连接编码需要为utf8mb4,字符集必须为utf8mb4,协作需要utf8mb4。对于Java来说,它仍然只是"utf-8",但是MySQL需要区别对待。 我不知道您使用的是什么驱动程序,但是与连接程序无关的一种设置连接字符集的方法是发送查询: SET NAMES 'utf8mb4' 建立连接之后。 另请参见Connector / J: 14.14:如何将4字节UTF8,utf8mb4与Connector / J一起使用? 要将4字节UTF8与Connector / J一起使用,请将MySQL服务器配置为character_set_server = utf8mb4。只要未在连接字符串中设置characterEncoding,Connector / J将使用该设置 。这等效于字符集的自动检测。 调整列和数据库: var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL 同样,您的MySQL版本需要相对最新才能获得utf8mb4支持。来源:stack overflow

保持可爱mmm 2020-05-17 13:13:04 0 浏览量 回答数 0

回答

您好,此类报警为硬盘使用率报警,建议您查看您的实例中的进程是否存在可疑进程。如果您的磁盘为数据盘, 您可以使用 磁盘扩容 功能扩容数据盘。 说明 建议在扩容数据盘之前手动创建快照,以备份数据。 无论数据盘的状态是   待挂载  还是   使用中,都可以执行磁盘扩容操作。 如果数据盘正在创建快照,则不允许执行扩容数据盘的操作。 包年包月实例如果做过   续费降配  操作,当前计费周期的剩余时间内,实例上的包年包月云盘不支持扩容磁盘操作。 扩容磁盘只是扩大数据盘容量,而不是扩容文件系统。 磁盘扩容只能扩容数据盘,不能扩容系统盘或本地盘(本地 SSD 盘等)。 挂载在实例上的数据盘,只有当实例处于   运行中  ( Running) 或   已停止( Stopped) 状态时才可以扩容。扩容这种数据盘需要在控制台上重启实例后才能使扩容后的容量生效,而重启实例会使您的实例停止工作,从而中断您的业务,所以请您 谨慎操作。 本文以一个高效云盘的数据盘和一个运行Windows Server 2008 R2企业版64位中文版的ECS实例为例,说明如何扩容数据盘并使扩容后的容量可用。示例中最初的磁盘大小为24 GiB,我们将其扩容到26 GiB。 您可以按以下步骤完成扩容操作: 步骤 1. 在控制台上扩容数据盘 步骤 2. 登录实例完成扩容 步骤 1. 在控制台上扩容数据盘 按以下步骤在控制台上扩容数据盘: 登录   ECS管理控制台。 在左侧导航栏里,选择   存储 > 云盘。 说明 如果您需要扩容的数据盘已经挂载在某个实例上,您可以单击  实例,找到相应实例后,进入实例详情页,并单击  本实例磁盘。 选择地域。 找到需要扩容的磁盘,并在   操作  列中,选择   更多 > 磁盘扩容。 在   磁盘扩容  页面上,设置   扩容后容量。在本示例中为26 GiB。扩容后容量只能比当前容量大。 待页面上显示费用信息后,单击   确定扩容。 说明 扩容成功后,磁盘列表里即显示扩容后的容量。但是,如果您的数据盘已经挂载到实例上,您需要在控制台上  重启实例 后,登录实例才能看到扩容后的数据盘容量。 在控制台上完成扩容后, 如果数据盘已经挂载到实例,可以直接执行   步骤 2. 登录实例完成扩容。 如果数据盘未挂载到实例上,您应先挂载数据盘(详见   挂载云盘),再根据数据盘的实际情况执行不同的操作: 如果这是一个全新的数据盘,您可以直接格式化数据盘。详见   Windows 格式化数据盘。 如果这个数据盘之前已经格式化并分区,您需要执行   步骤 2. 登录实例完成扩容。 步骤 2. 登录实例完成扩容 按以下步骤在实例内部完成数据盘扩容: 使用软件连接Windows实例。 在Windows Server桌面,单击服务器管理器图标   。 在   服务器管理器  的左侧导航窗格里,选择   存储 > 磁盘管理。在磁盘管理区域,可以看到新增的数据盘空间与旧的数据盘空间之间的关系。本例中, 磁盘 2  是扩容的数据盘。 右键单击   磁盘 2,选择   转换到动态磁盘,并按页面提示将基本磁盘转换为动态磁盘。   说明 基本磁盘转换成动态磁盘,操作的过程中会将磁盘从系统中卸载下来。如果数据盘内安装了应用程序,转换过程中这些应用程序暂时无法使用。转换过程中不会造成数据丢失。 完成转换后,磁盘 2 在磁盘管理器中显示如下。 右键单击磁盘 2的简单卷的任一空白处,并选择   扩展卷。 根据   扩展卷向导  的指示完成扩展卷操作。完成后,新增的数据盘空间会自动合入原来的卷中, 磁盘 2  在磁盘管理器中显示如下。 说明 如果是Windows Server 2003,完成后新增的数据盘空间会自动增加到数据盘中,但是在磁盘管理器中,新增的数据盘空间会以一个独立卷的形式存在。Windows Server 2003中,扩容多少次就会有创建多少个独立的卷,不会将所有的卷都合并到之前的卷里面,但并不会影响实际使用。以下是一个Windows Server 2003系统里扩容后数据盘的显示信息。 至此,您已经完成了扩容数据盘。 如果您对我的回答满意,请您采纳一下,谢谢!

zihangu 2019-12-02 00:30:26 0 浏览量 回答数 0

回答

我的两个程序都遇到了相同的问题。我的错误是这样的: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 我花了几天时间解决这个问题。我已经测试了不同网站中提到的许多方法,但是没有一种有效。最后,我更改了代码,找出了问题所在。我将尝试向您介绍不同的方法,并在此处进行总结。 当我在互联网上寻找该错误的解决方案时,我发现有许多解决方案至少对一个人有用,但其他人则说这不适用于他们! 为什么有很多方法可以解决此错误? 似乎通常在连接到服务器时出现此错误。可能是因为错误的查询字符串或与数据库的连接过多。 因此,我建议您一个接一个地尝试所有解决方案,不要放弃! 这是我在互联网上找到的解决方案,对于每个解决方案,至少都有人用该解决方案解决了他的问题。 提示:对于需要更改MySQL设置的解决方案,可以参考以下文件: Linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于Linux发行版和使用的MySQL软件包) Windows:C:** ProgramData ** \ MySQL \ MySQL Server 5.6 \ my.ini(请注意,它是ProgramData,而不是Program Files) 以下是解决方案: 更改“绑定地址”属性 取消注释“绑定地址”属性或将其更改为以下IP之一: bind-address =“ 127.0.0.1” 要么 绑定地址=“ 0.0.0.0” 注释掉“跳过网络” 如果您的MySQL配置文件中有“跳过网络”行,请在该行的开头添加“#”符号使其成为注释。 更改“ wait_timeout”和“ interactive_timeout” 将这些行添加到MySQL配置文件中: wait_timeout = 数字 Interactive_timeout = 数字 connect_timeout = 数字 确保Java没有将'localhost'转换为[::: 1]而不是[127.0.0.1] 由于MySQL可以识别127.0.0.1(IPv4)但不能识别::: 1(IPv6) 可以通过使用以下两种方法之一来避免这种情况: 选项#1:在连接字符串中使用127.0.0.1代替localhost,以避免将localhost转换为::: 1 选项#2:使用选项-Djava.net.preferIPv4Stack = true运行Java,以强制Java使用IPv4而不是IPv6。在Linux上,也可以通过运行(或将其放在/ etc / profile中: export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true" 检查操作系统代理设置,防火墙和防病毒程序 确保防火墙或防病毒软件没有阻止MySQL服务。 在Linux上暂时停止iptables。如果iptables配置错误,它们可能允许将tcp数据包发送到mysql端口,但阻止tcp数据包通过同一连接返回。 Redhat enterprise and CentOS systemctl stop iptables.service Other linux distros service iptables stop 在Windows上停止防病毒软件。 更改连接字符串 检查您的查询字符串。您的连接字符串应如下所示: dbName = "my_database"; dbUserName = "root"; dbPassword = ""; String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8"; 确保您的字符串中没有空格。所有连接字符串应继续,且不包含任何空格字符。 尝试用回送地址127.0.0.1替换“ localhost”。也尝试将端口号添加到您的连接字符串中,例如: String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8"; 通常,MySQL的默认端口是3306。 不要忘记将用户名和密码更改为MySQL服务器的用户名和密码。 更新您的JDK驱动程序库文件 测试不同的JDK和JRE(例如JDK 6和7) 不要更改max_allowed_pa​​cket “ max_allowed_pa​​cket ”是MySQL配置文件中的一个变量,指示最大包大小,而不是最大包数。因此,这无助于解决此错误。 更改tomcat的安全性 将TOMCAT6_SECURITY =是更改为TOMCAT6_SECURITY =否 使用validationQuery属性 使用validationQuery =“ select now()”确保每个查询都有响应 自动重新连接 将此代码添加到您的连接字符串中: &autoReconnect=true&failOverReadOnly=false&maxReconnects=10 尽管这些解决方案都不适合我,但我建议您尝试一下。因为有些人按照以下步骤解决了他们的问题。 但是什么解决了我的问题? 我的问题是我在数据库上有很多SELECT。每次创建连接然后关闭它时。尽管我每次都关闭连接,但是系统面临许多连接,并给了我这个错误。我所做的是将连接变量定义为整个类的公共(或私有)变量,并在构造函数中对其进行了初始化。然后,每次我使用该连接时。它解决了我的问题,也大大提高了我的速度。 结论 没有简单独特的方法可以解决此问题。我建议您考虑自己的情况并选择上述解决方案。如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接字符串可能有问题。但是,如果在与数据库进行多次成功交互之后出现此错误,则问题可能出在连接数上,您可能会考虑更改“ wait_timeout”和其他MySQL设置,或者重写您的代码以减少连接数。来源:stack overflow

保持可爱mmm 2020-05-08 10:55:29 0 浏览量 回答数 0

回答

除非无法避免,否则最好的方法是使MySQL表不这样做。 在编写应用程序时,通常希望以最大化速度和开发者速度的方式进行编写。仅在必要时才优化延迟(直到准备好答案的时间)或吞吐量(每个时间单位的答案数)。 仅当所有这些分区的总和不再适合单个数据库服务器实例时,才对分区进行分区,然后将其分配给不同的主机(=分片)-原因是写入或读取。 写的情况是a)写入频率使该服务器磁盘永久过载,或者b)正在进行过多的写操作,因此复制永久滞后于此复制层次结构中。 分片的读取情况是数据的大小太大,以致其工作集不再适合内存,并且数据读取开始击中磁盘,而不是大部分时间从内存中获取数据。 仅在必须分片时才这样做。 分片后,您会以多种方式为此付费: 您的大多数SQL不再是声明性的。 通常,在SQL中,您是在告诉数据库所需的数据,然后将其留给优化器以将其转换为数据访问程序。这是一件好事,因为它很灵活,而且因为编写这些数据访问程序是无聊的工作,会损害速度。 在分片环境中,您可能正在将节点A上的表与节点B上的数据连接起来,或者在节点A和B上具有比节点大的表,并将来自该表的数据与节点B和C上的数据连接起来。为了解决该问题,您开始手动编写基于应用程序端的基于散列的连接解析(或者您正在重塑MySQL集群),这意味着您最终将获得许多不再声明性的SQL,而是以过程方式表达SQL功能的SQL。 (例如,您在循环中使用SELECT语句)。 您将招致很多网络延迟。 通常,SQL查询可以在本地解决,优化器会知道与本地磁盘访问相关的成本,并以使成本最小化的方式来解析查询。 在分片环境中,可以通过以下方式解决查询:在网络上对多个节点运行键值访问(希望通过批量键访问,而不是每次往返都进行单个键查找),或者通过将WHERE子句的一部分向前推到它们可以使用的节点上或同时应用(称为“条件下推”)。 但是,即使在最好的情况下,这也要涉及比本地情况更多的网络往返,并且更加复杂。尤其是由于MySQL优化器对网络延迟一无所知(好吧,MySQL群集正在慢慢变得更好,但是对于群集外的原始MySQL来说仍然如此)。 您正在失去大量的SQL表达能力。 好的,这可能不太重要,但是外键约束和其他SQL数据完整性机制无法跨越多个分片。 MySQL没有允许正常工作的异步查询的API。 当相同类型的数据驻留在多个节点上(例如,节点A,B和C上的用户数据)时,通常需要针对所有这些节点解决横向查询(“查找90天未登录的所有用户帐户”或者更多”)。数据访问时间随节点数线性增长,除非可以并行请求多个节点并且结果随输入而汇总(“ Map-Reduce”)。 前提条件是异步通信API,对于良好的MySQL而言,它不存在。另一种选择是在子过程中进行大量分叉和建立联系,这正在访问整个季节过程。 一旦开始分片,数据结构和网络拓扑将成为您应用程序的性能指标。为了合理地执行性能,您的应用程序需要了解这些内容,这意味着实际上只有应用程序级分片才有意义。 问题是更多的,如果您想自动分片(例如,通过对主键进行散列来确定哪一行进入哪个节点),或者您想以手动方式进行功能拆分(“与xyz用户案例相关的表将转到此主,而与abc和def相关的表将转到该主”。 功能分片的优势在于,如果操作正确,大多数时候大多数开发人员都看不到它,因为与用户故事相关的所有表都可以在本地使用。这使他们仍然可以尽可能长时间地受益于声明式SQL,并且由于跨网络传输的次数保持最小,因此还可以减少网络延迟。 功能分片的缺点是它不允许任何单个表都大于一个实例,并且需要设计人员的手动注意。 功能性分片的优点是,相对容易地对现有代码库进行了很多更改,但变化不算太大。在过去的几年中,http://Booking.com做了多次,对他们来说效果很好。 说了这么多,看着你的问题,我相信你在问错问题,或者我完全误解了你的问题陈述。来源:stack overflow

保持可爱mmm 2020-05-17 20:49:45 0 浏览量 回答数 0

回答

索引,索引!!!为经常查询的字段建索引!! 但也不能过多地建索引。insert和delete等改变表记录的操作会导致索引重排,增加数据库负担。优化目标1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。2.降低 CPU 计算 除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标优化方法改变 SQL 执行计划 明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标分析复杂的SQL语句explain 例如: mysql> explain select from (select from ( select * from t3 where id=3952602) a) b; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY system NULL NULL NULL NULL 1 2 DERIVED system NULL NULL NULL NULL 1 3 DERIVED t3 const PRIMARY,idx_t3_id PRIMARY 4 1 很显然这条SQL是从里向外的执行,就是从id=3 向上执行.show show tables或show tables from database_name; // 显示当前数据库中所有表的名称 show databases; // 显示mysql中所有数据库的名称 show columns from table_name from database_name; 或MySQL show columns from database_name.table_name; // 显示表中列名称 show grants for user_name@localhost; // 显示一个用户的权限,显示结果类似于grant 命令 show index from table_name; // 显示表的索引 show status; // 显示一些系统特定资源的信息,例如,正在运行的线程数量 show variables; // 显示系统变量的名称和值show processlist; // 显示系统中正在运行的所有进程,也就是当前正在执行的查询。 show table status; // 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间 show privileges; // 显示服务器所支持的不同权限 show create database database_name; // 显示create database 语句是否能够创建指定的数据库 show create table table_name; // 显示create database 语句是否能够创建指定的数据库 show engies; // 显示安装以后可用的存储引擎和默认引擎。 show innodb status; // 显示innoDB存储引擎的状态 show logs; // 显示BDB存储引擎的日志 show warnings; // 显示最后一个执行的语句所产生的错误、警告和通知 show errors; // 只显示最后一个执行语句所产生的错误关于enum 存在争议。 对于取值有限且固定的字段,推荐使用enum而非varchar。但是!!其他数据库可能不支持,导致了难于迁移的问题。开启缓存查询 对于完全相同的sql,使用已经存在的执行计划,从而跳过解析和生成执行计划的过程。 应用场景:有一个不经常变更的表,且服务器收到该表的大量相同查询。对于频繁更新的表,查询缓存是不适合的 Mysql 判断是否命中缓存的办法很简单,首先会将要缓存的结果放在引用表中,然后使用查询语句,数据库名称,客户端协议的版本等因素算出一个hash值,这个hash值与引用表中的结果相关联。如果在执行查询时,根据一些相关的条件算出的hash值能与引用表中的数据相关联,则表示查询命中 查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。 下面sql查询缓存认为是不同的: SELECT * FROM tbl_name Select * from tbl_name 缓存机制失效的场景 如果查询语句中包含一些不确定因素时(例如包含 函数Current()),该查询不会被缓存,不确定因素主要包含以下情况 · 引用了一些返回值不确定的函数 · 引用自定义函数(UDFs)。 · 引用自定义变量。 · 引用mysql系统数据库中的表。 · 下面方式中的任何一种: SELECT ...IN SHARE MODE SELECT ...FOR UPDATE SELECT ...INTO OUTFILE ... SELECT ...INTO DUMPFILE ... SELECT * FROM ...WHERE autoincrement_col IS NULL · 使用TEMPORARY表。 · 不使用任何表。 · 用户有某个表的列级别权限。额外的消耗 如果使用查询缓存,在进行读写操作时会带来额外的资源消耗,消耗主要体现在以下几个方面 · 查询的时候会检查是否命中缓存,这个消耗相对较小 · 如果没有命中查询缓存,MYSQL会判断该查询是否可以被缓存,而且系统中还没有对应的缓存,则会将其结果写入查询缓存 · 如果一个表被更改了,那么使用那个表的所有缓冲查询将不再有效,并且从缓冲区中移出。这包括那些映射到改变了的表的使用MERGE表的查询。一个表可以被许多类型的语句更改,例如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE。 对于InnoDB而言,事物的一些特性还会限制查询缓存的使用。当在事物A中修改了B表时,因为在事物提交之前,对B表的修改对其他的事物而言是不可见的。为了保证缓存结果的正确性,InnoDB采取的措施让所有涉及到该B表的查询在事物A提交之前是不可缓存的。如果A事物长时间运行,会严重影响查询缓存的命中率 查询缓存的空间不要设置的太大。 因为查询缓存是靠一个全局锁操作保护的,如果查询缓存配置的内存比较大且里面存放了大量的查询结果,当查询缓存失效的时候,会长时间的持有这个全局锁。因为查询缓存的命中检测操作以及缓存失效检测也都依赖这个全局锁,所以可能会导致系统僵死的情况静态表速度更快定长类型和变长类型 CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。 VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。 如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。VARCHAR和TEXT、BlOB类型 VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。 BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。 一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。 BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。 在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。 效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char char和varchar可以有默认值,text不能指定默认值静态表和动态表 静态表字段长度固定,自动填充,读写速度很快,便于缓存和修复,但比较占硬盘,动态表是字段长度不固定,节省硬盘,但更复杂,容易产生碎片,速度慢,出问题后不容易重建。当只需要一条数据的时候,使用limit 1 表记录中的一行尽量不要超过一个IO单元 区分in和exist select * from 表A where id in (select id from 表B)这句相当于select from 表A where exists(select from 表B where 表B.id=表A.id)对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示 区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。 所以IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况复杂多表尽量少用join MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在 Join 这方面所下的功夫还不够,所以性能表现离 Oracle 等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。尽量用join代替子查询 虽然 Join 性能并不佳,但是和 MySQL 的子查询比起来还是有非常大的性能优势。 MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句在临时表中查询记录。查询完毕后,MySQL需要插销这些临时表。所以在MySQL中可以使用连接查询来代替子查询。连接查询不需要建立临时表,其速度比子查询要快。尽量少排序 排序操作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL 的响应时间。 对于MySQL来说,减少排序有多种办法,比如: 上面误区中提到的通过利用索引来排序的方式进行优化 减少参与排序的记录条数 非必要不对数据进行排序尽量避免select * 大多数关系型数据库都是按照行(row)的方式存储,而数据存取操作都是以一个固定大小的IO单元(被称作 block 或者 page)为单位,一般为4KB,8KB… 大多数时候,每个IO单元中存储了多行,每行都是存储了该行的所有字段(lob等特殊类型字段除外)。 所以,我们是取一个字段还是多个字段,实际上数据库在表中需要访问的数据量其实是一样的。 也有例外情况,那就是我们的这个查询在索引中就可以完成,也就是说当只取 a,b两个字段的时候,不需要回表,而c这个字段不在使用的索引中,需要回表取得其数据。在这样的情况下,二者的IO量会有较大差异。尽量少or 当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并没有很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,造成了其性能比较低下,很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。尽量用 union all 代替 union union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。尽量早过滤 在 SQL 编写中同样可以使用这一原则来优化一些 Join 的 SQL。比如我们在多个表进行分页数据查询的时候,我们最好是能够在一个表上先过滤好数据分好页,然后再用分好页的结果集与另外的表 Join,这样可以尽可能多的减少不必要的 IO 操作,大大节省 IO 操作所消耗的时间。避免类型转换 这里所说的“类型转换”是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换: 人为在column_name 上通过转换函数进行转换直接导致 MySQL(实际上其他数据库也会有同样的问题)无法使用索引,如果非要转换,应该在传入的参数上进行转换,由数据库自己进行转换, 如果我们传入的数据类型和字段类型不一致,同时我们又没有做任何类型转换处理,MySQL 可能会自己对我们的数据进行类型转换操作,也可能不进行处理而交由存储引擎去处理,这样一来,就会出现索引无法使用的情况而造成执行计划问题。优先优化高并发的 SQL,而不是执行频率低某些“大”SQL 对于破坏性来说,高并发的 SQL 总是会比低频率的来得大,因为高并发的 SQL 一旦出现问题,甚至不会给我们任何喘息的机会就会将系统压跨。而对于一些虽然需要消耗大量 IO 而且响应很慢的 SQL,由于频率低,即使遇到,最多就是让整个系统响应慢一点,但至少可能撑一会儿,让我们有缓冲的机会。从全局出发优化,而不是片面调整 尤其是在通过调整索引优化 SQL 的执行计划的时候,千万不能顾此失彼,因小失大。尽可能对每一条运行在数据库中的SQL进行 explain 知道 SQL 的执行计划才能判断是否有优化余地,才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化之后,很明显的问题 SQL 可能已经很少了,大多都需要去发掘,这时候就需要进行大量的 explain 操作收集执行计划,并判断是否需要进行优化。尽量避免where子句中对字段进行null值的判断 会导致引擎放弃索引,进而进行全表扫描。 尽量不要给数据库留null值,尽可能地使用not null填充数据库。可以为每个null型的字段设置一个和null对应的实际内容表述。避免在where中使用!=, >, <操作符 否则引擎放弃使用索引,进行全表扫描。常用查询字段建索引避免在where中使用or imagein和not in关键词慎用,容易导致全表扫面 对连续的数值尽量用between通配符查询也容易导致全表扫描避免在where子句中使用局部变量 sql只有在运行时才解析局部变量。而优化程序必须在编译时访问执行计划,这时并不知道变量值,所以无法作为索引的输入项。 image避免在where子句中对字段进行表达式操作 会导致引擎放弃使用索引 image避免在where子句中对字段进行函数操作 image不要where子句的‘=’左边进行函数、算术运算或其他表达式运算 系统可能无法正确使用索引避免update全部字段 只update需要的字段。频繁调用会引起明显的性能消耗,同时带来大量日志。索引不是越多越好 一个表的索引数最好不要超过6个尽量使用数字型字段而非字符型 因为处理查询和连接时会逐个比较字符串的每个字符,而对于数字型而言只需要比较一次就够了。尽可能用varchar/nvarchar代替char/nchar 变长字段存储空间小,对于查询来说,在一个相对较小的字段内搜索效率更高。。。?避免频繁创建和删除临时表,减少系统表资源消耗select into和create table 新建临时表时,如果一次性插入数据量很大,使用select into代替create table,避免造成大量log,以提高速度。 如果数据量不大,为了缓和系统表的资源,先create table,再insert。 拆分大的DELETE和INSERT语句 因为这两个操作是会锁表的,对于高访问量的站点来说,锁表时间内积累的访问数、数据库连接、打开的文件数等等,可能不仅仅让WEB服务崩溃,还会让整台服务器马上挂了。 所以,一定要拆分,使用LIMIT条件休眠一段时间,批量处理。

wangccsy 2019-12-02 01:50:30 0 浏览量 回答数 0

回答

高可用架构部署方案 高可用架构提供业务分发、弹性扩展、多可用区部署等功能。相较于使用单台ECS实例部署数据库与应用,高可用架构只需简单部署,并且拥有更高的稳定性和可扩展性。 高可用架构特点 高可用架构具有如下特点: 使用多可用区高可用版的负载均衡SLB(Server Load Balancer)对多台云服务器ECS进行流量分发,可扩展应用系统对外服务能力、消除单点故障,提升应用系统的可用性。使用SLB自动跨可用区部署,可加强业务容灾能力。 通过自定义镜像,可以迅速复制出相同应用部署的云服务器ECS实例,之后将实例添加到SLB后端服务器组中,实现业务高可用。SLB可以同时配置四层和七层监听,及轮循、加权轮循、加权最小连接数等多种算法,合理分配后端ECS计算资源。 使用云数据库RDS(Relational Database Service),针对高并发场景进行特殊优化,同时引入线程池、并行复制、隐含主键等功能保证系统持续稳定和高吞吐。云数据库CloudDBA具有完备的性能监控数据,实时监控实例硬件使用指标、慢SQL,并给出各种优化建议,帮您快速定位并解决问题。 部署流程 假设您已拥有一台ECS实例,并且在该实例上部署了数据库与应用,您可以将单实例部署方式转变为单可用区或多可用区高可用架构。本教程指导您如何使用ECS、EIP、SLB和RDS产品来部署多可用区高可用架构。 高可用结构图 使用自定义镜像,部署多台相同配置的ECS实例。详情请参见复制ECS实例。 创建负载均衡SLB实例,将实例添加到SLB后端服务器组中,用于跨可用区挂载ECS实例,实现业务的高可用性。详情请参见配置SLB实例。 使用DTS将ECS实例上的自建数据库迁移至RDS实例,保障业务数据库不中断,自动备份保障数据不丢失。详情请参见迁移自建数据库至RDS实例。 复制ECS实例为了支持跨可用区容灾部署,本教程使用源实例的自定义镜像复制出三台ECS实例。一台与源实例位于同一可用区,两台与源实例位于同一地域下的不同可用区。 前提条件 已注册阿里云账号。如还未注册,请先完成账号注册。 已拥有待复制的源ECS实例。 操作步骤 为ECS实例创建自定义镜像。 登录ECS管理控制台。 在左侧导航栏,单击实例与镜像 > 实例。 在顶部状态栏处,选择地域。 找到目标实例。在操作列中,单击更多 > 磁盘和镜像 > 创建自定义镜像。 输入镜像名称和描述信息。 单击创建。 说明 创建镜像需要一段时间,请您耐心等待。 在左侧导航栏,单击实例与镜像 > 镜像。当目标镜像的进度为100%、状态为可用时,表示镜像创建成功。自定义镜像 使用自定义镜像创建3台ECS实例。 在左侧导航栏,单击实例与镜像 > 镜像。 在自定义镜像页面,找到上一步创建的自定义镜像,在操作列,单击创建实例。 在自定义购买页面,镜像区域已设置为您选择的自定义镜像。根据页面提示,完成其他配置项并购买1台ECS实例。 其中: 地域:选择与源实例相同的地域。 可用区:选择与源实例相同的可用区。 公网带宽:取消勾选分配公网IPv4地址。 更多配置详情,请参见使用向导创建实例。 重复第i步和第ii步。在自定义购买页,镜像区域已设置为您选择的自定义镜像。根据页面提示,完成其他配置项并购买2台实例。 其中: 地域:选择与源实例相同的地域。 可用区:选择与源实例不同的可用区。 实例区域:设置购买实例数量为2。 公网带宽区域:取消勾选分配公网IPv4地址。 更多配置详情,请参见使用向导创建实例。 执行结果 在左侧导航栏,单击实例与镜像 > 实例。在实例列表页面,四台ECS实例的状态均为运行中,可用区两两相同。 ecs_instances 配置SLB实例 ECS实例复制完成后,在支持多可用区的地域创建负载均衡SLB实例,用于跨可用区挂载ECS实例,扩展应用系统对外服务能力、消除单点故障,提升应用系统的可用性。本文介绍SLB实例的部署方法。 前提条件 已复制三台ECS实例,详情请参见复制ECS实例。 四台ECS实例的Web服务均已启动并正常运行。 注意 若Web服务未运行,则SLB实例与ECS实例之间无法正常通信。 操作步骤 创建SLB实例。具体操作,请参见创建负载均衡实例。 本教程使用的配置如下: 地域:必须与ECS实例位于同一地域。 可用区类型:选择多可用区。 实例类型:选择私网。 网络类型:选择专有网络。 主可用区和备可用区:按需配置。 create_slb 将源实例的公网IP转换为弹性公网IP。具体操作,请参见专有网络公网IP转换为弹性公网IP。 说明 为避免影响业务,需保证源实例IP地址不变。因此,需要先将源实例的公网IP转换为弹性公网IP,与源实例解绑后,再将其绑定至高可用版SLB实例上。 ip_eip 解绑源实例与弹性公网IP。 在源实例的IP地址列,单击弹性IP地址链接。 click_eip 在弹性公网IP页面,单击解绑。 unbindEIP 单击确定。更多详情,请参见解绑EIP。 绑定弹性公网IP至SLB实例。 在弹性公网IP页面,找到与源实例解绑后的弹性公网IP。 bindEIP 在操作列,单击绑定。 实例类型选择SLB实例,SLB实例选择刚创建的SLB实例,单击确定。更多详情,请参见绑定SLB实例。 配置SLB实例。具体操作,请参见配置负载均衡实例。 基本配置如下: 在协议&监听页签,完成以下配置。 负载均衡协议:选择TCP。 监听端口:输入80。 调度算法:按需选择。本教程选择轮询。 其他配置使用默认值。 configure_slb 单击下一步。在后端服务器页签,选择默认服务器组,单击继续添加添加ECS实例。 addEcsInstance 勾选源实例和已复制的三台ECS实例,单击下一步:配置权重和端口号。端口配置为80,其他值保持默认,单击下一步。 configure_ports 在健康检查页签,使用默认值,单击下一步。 在配置审核页签,核对信息后,单击提交。 单击确定,返回实例管理页面,单击refresh。 当健康检查状态为正常时,表示后端ECS实例可以正常处理负载均衡转发的请求了。 说明 健康检查需要几分钟时间,请您耐心等待并单击刷新图标查看状态。 health_check 执行结果 为方便测试,本教程分别在四台ECS实例上搭建了静态网页,以标识每台ECS实例。在浏览器中输入负载均衡实例的服务地址,测试负载均衡服务。由于调度算法为轮询,请求会轮流发往每台ECS实例。 slb_test 迁移自建数据库至RDS实例 将源ECS实例上的数据库迁移至高可用版云数据库RDS,可实现数据库服务的高可用性、高可靠性、高安全性和高易用性。本教程以MySQL数据库为例,介绍如何使用DTS将ECS实例上的自建数据库迁移至RDS实例。 前提条件 已配置SLB实例,详情请参见配置SLB实例。 已创建高可用版RDS实例。如未创建,请参见创建RDS for MySQL实例。 已为RDS实例创建账号。如未创建,请参见创建账号和数据库。 已为ECS实例上的自建数据库创建非root账号,用于DTS迁移。 例如,您可以运行以下命令为MySQL数据库创建名为dts、密码为123456的账号。 grant all on . to 'dts'@'%' IDENTIFIED BY '123456'; 背景信息 DTS提供的数据迁移功能能够支持同异构数据源之间的数据迁移,同时提供了库表列三级映射、数据过滤多种ETL特性。您可以使用DTS进行零停机迁移,在迁移过程中,源数据库正常持续提供服务,最大程度降低迁移对业务的影响。DTS支持的数据库类型请参见数据迁移。 操作步骤 登录数据传输DTS控制台。 在左侧导航栏,选择数据迁移。 选择目标RDS实例所在地域,并单击创建迁移任务。 配置迁移任务。 配置任务名称。 您可以使用默认的名称或者自定义名称。 配置源库信息。 DTS支持通过公网、VPN网关、专线及智能网关访问的自建数据库。本教程使用的源数据库为ECS实例上的自建数据库。其他类型数据库的迁移方案,请参见DTS用户手册。 参数名称 描述 实例类型 ECS上的自建数据库。 实例地区 源ECS实例所在地域。 ECS实例ID 源ECS实例的实例ID。DTS支持经典网络及专有网络的ECS实例。 数据库类型 源ECS实例上自建数据库的类型。本示例中,数据库类型为MySQL。 端口 MySQL数据库监听的端口号。 数据库账号 源ECS实例上MySQL数据库的非root账号。 说明 数据库账号必须填写非root账号,否则测试连接时会报错。 数据库密码 非root账号对应的密码。 单击源库信息右下角的测试连接。 当返回的结果为测试通过时,表示源库连接正常。 配置目标库信息。 参数名称 参数值 实例类型 RDS实例。 实例地区 RDS实例所在地域。 RDS实例ID RDS实例的实例ID。 数据库账号 RDS实例的账号。 为RDS实例创建账号,请参见创建账号和数据库。 说明 数据库账号必须填写非root账号,否则测试连接时会报错。 数据库密码 账号对应的密码。 单击目标库信息右下角的测试连接。 当返回的结果为测试通过时,表示目标库连接正常。 单击授权白名单并进入下一步。 配置迁移类型及迁移对象。 配置迁移类型。 业务零停机迁移,请选择:结构迁移+全量数据迁移+增量数据迁移。 全量迁移,请选择:结构迁移+全量数据迁移。 配置迁移对象。 在迁移对象框中单击要迁移的数据库对象,如数据库、表或列,然后单击>添加到已选择对象框中。 说明 默认情况下,数据库对象迁移到ECS自建MySQL实例后,对象名跟本地MySQL实例一致。如果迁移的数据库对象在源实例跟目标实例上名称不同,您需要使用DTS提供的对象名映射功能,详情请参见库表列映射。 单击预检查并启动。 在迁移任务正式启动之前,会预检查连通性、权限及日志格式等。下图表示预检查成功通过。 precheck 预检查通过后,您可以在迁移任务列表中查看迁移任务的迁移状态及进度。 task_result 后续步骤 在应用程序中配置RDS实例的连接地址和账号密码,以连接到RDS实例。您还可以使用数据管理服务DMS(Data Management Service)或客户端管理RDS实例。具体操作,请参见连接MySQL实例。

1934890530796658 2020-03-25 19:18:04 0 浏览量 回答数 0

问题

DRDS 错误代码如何解决?

猫饭先生 2019-12-01 21:21:21 7993 浏览量 回答数 0

问题

【精品问答】Python二级考试题库

珍宝珠 2019-12-01 22:03:38 1146 浏览量 回答数 2

回答

1.阻塞与同步2.BIO与NIO对比3.NIO简介4.缓冲区Buffer5.通道Channel6.反应堆7.选择器8.NIO源码分析9.AIO1.阻塞与同步1)阻塞(Block)和非租塞(NonBlock):阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候阻塞:往往需要等待缞冲区中的数据准备好过后才处理其他的事情,否則一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回2)同步(Synchronization)和异步(Async)的方式:同步和异步都是基于应用程序私操作系统处理IO事件所采用的方式,比如同步:是应用程序要直接参与IO读写的操作。异步:所有的IO读写交给搡作系统去处理,应用程序只需要等待通知。同步方式在处理IO事件的时候,必须阻塞在某个方法上靣等待我们的IO事件完成(阻塞IO事件或者通过轮询IO事件的方式).对于异步来说,所有的IO读写都交给了搡作系统。这个时候,我们可以去做其他的事情,并不拓要去完成真正的IO搡作,当搡作完成IO后.会给我们的应用程序一个通知同步:阻塞到IO事件,阻塞到read成则write。这个时候我们就完全不能做自己的事情,让读写方法加入到线程里面,然后阻塞线程来实现,对线程的性能开销比较大,参考:https://blog.csdn.net/CharJay_Lin/article/details/812598802.BIO与NIO对比block IO与Non-block IO1)区别IO模型 IO NIO方式 从硬盘到内存 从内存到硬盘通信 面向流(乡村公路) 面向缓存(高速公路,多路复用技术)处理 阻塞IO(多线程) 非阻塞IO(反应堆Reactor)触发 无 选择器(轮询机制)2)面向流与面向缓冲Java NIO和IO之间第一个最大的区别是,IO是面向流的.NIO是面向缓冲区的。Java IO面向流意味着毎次从流中读一个成多个字节,直至读取所有字节,它们没有被缓存在任何地方,此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的教据,需要先将它缓存到一个缓冲区。Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,霱要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数裾。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。3)阻塞与非阻塞Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。4)选择器(Selector)Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择"通道:这些通里已经有可以处理的褕入,或者选择已准备写入的通道。这选怿机制,使得一个单独的线程很容易来管理多个通道。5)NIO和BIO读取文件BIO读取文件:链接BIO从一个阻塞的流中一行一行的读取数据image | left | 469x426NIO读取文件:链接通道是数据的载体,buffer是存储数据的地方,线程每次从buffer检查数据通知给通道image | left | 559x3946)处理数据的线程数NIO:一个线程管理多个连接BIO:一个线程管理一个连接3.NIO简介在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,面向流的I/O速度非常慢,而在Java 1.4中推出了NIO,这是一个面向块的I/O系统,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据库,按块处理要比按字节处理数据快的多。在NIO中有几个核心对象需要掌握:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。参考:链接image2.png | center | 851x3834.缓冲区Buffer缓冲区实际上是一个容器对象,更直接的说,其实就是一个数组,在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,它也是写入到缓冲区中的;任何时候访问 NIO 中的数据,都是将它放到缓冲区中。而在面向流I/O系统中,所有数据都是直接写入或者直接将数据读取到Stream对象中。在NIO中,所有的缓冲区类型都继承于抽象类Buffer,最常用的就是ByteBuffer,对于Java中的基本类型,基本都有一个具体Buffer类型与之相对应,它们之间的继承关系如下图所示:image3.png | center | 650x3681)其中的四个属性的含义分别如下:容量(Capacity):缓冲区能够容纳的数据元素的最大数量。这一个容量在缓冲区创建时被设定,并且永远不能改变。上界(Limit):缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数。位置(Position):下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新。标记(Mark):下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新。2)Buffer的常见方法如下所示:flip(): 写模式转换成读模式rewind():将 position 重置为 0 ,一般用于重复读。clear() :compact(): 将未读取的数据拷贝到 buffer 的头部位。mark(): reset():mark 可以标记一个位置, reset 可以重置到该位置。Buffer 常见类型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、 LongBuffer 、 ShortBuffer 。3)基本操作Buffer基础操作: 链接缓冲区分片,缓冲区分配,直接缓存区,缓存区映射,缓存区只读:链接4)缓冲区存取数据流程存数据时position会++,当停止数据读取的时候调用flip(),此时limit=position,position=0读取数据时position++,一直读取到limitclear() 清空 buffer ,准备再次被写入 (position 变成 0 , limit 变成 capacity) 。5.通道Channel通道是一个对象,通过它可以读取和写入数据,当然了所有数据都通过Buffer对象来处理。我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的缓冲区。同样不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。image4.png | center | 368x191在NIO中,提供了多种通道对象,而所有的通道对象都实现了Channel接口。它们之间的继承关系如下图所示:image5.png | center | 650x5171)使用NIO读取数据在前面我们说过,任何时候读取数据,都不是直接从通道读取,而是从通道读取到缓冲区。所以使用NIO读取数据可以分为下面三个步骤:从FileInputStream获取Channel 创建Buffer 将数据从Channel读取到Buffer中 例子:链接 2)使用NIO写入数据使用NIO写入数据与读取数据的过程类似,同样数据不是直接写入通道,而是写入缓冲区,可以分为下面三个步骤:从FileInputStream获取Channel 创建Buffer 将数据从Channel写入到Buffer中 例子:链接 6.反应堆1)阻塞IO模型在老的IO包中,serverSocket和socket都是阻塞式的,因此一旦有大规模的并发行为,而每一个访问都会开启一个新线程。这时会有大规模的线程上下文切换操作(因为都在等待,所以资源全都被已有的线程吃掉了),这时无论是等待的线程还是正在处理的线程,响应率都会下降,并且会影响新的线程。image6.png | center | 739x3362)NIOJava NIO是在jdk1.4开始使用的,它既可以说成“新IO”,也可以说成非阻塞式I/O。下面是java NIO的工作原理:1.由一个专门的线程来处理所有的IO事件,并负责分发。2.事件驱动机制:事件到的时候触发,而不是同步的去监视事件。3.线程通讯:线程之间通过wait,notify等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。image7.png | center | 689x251注:每个线程的处理流程大概都是读取数据,解码,计算处理,编码,发送响应。7.选择器传统的 server / client 模式会基于 TPR ( Thread per Request ) .服务器会为每个客户端请求建立一个线程.由该线程单独负贵处理一个客户请求。这种模式带未的一个问题就是线程数是的剧增.大量的线程会增大服务器的开销,大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这又带来了新的问题,如果线程池中有 200 个线程,而有 200 个用户都在进行大文件下载,会导致第 201 个用户的请求无法及时处理,即便第 201 个用户只想请求一个几 KB 大小的页面。传统的 Sorvor / Client 模式如下围所示:image8.png | center | 597x286NIO 中非阻塞IO采用了基于Reactor模式的工作方式,IO调用不会被阻塞,相反是注册感兴趣的特点IO事件,如可读数据到达,新的套接字等等,在发生持定率件时,系统再通知我们。 NlO中实现非阻塞IO的核心设计Selector,Selector就是注册各种IO事件的地方,而且当那些事件发生时,就是这个对象告诉我们所发生的事件。image9.png | center | 462x408当有读或者写等任何注册的事件发生时,可以从Selector中获得相应的SelectionKey,同时从SelectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,以获得客户端发送过来的数据。使用NIO中非阻塞IO编写服务器处理程序,有三个步骤1.向Selector对象注册感兴趣的事件2.从Selector中获取感兴趣的事件3.根据不同事件进行相应的处理8.NIO源码分析Selector是NIO的核心epool模型1)SelectorSelector的open()方法:链接2)ServerSocketChannelServerSocketChannel.open() 链接9.AIOAsynchronous IO异步非阻塞IOBIO ServerSocketNIO ServerSocketChannelAIO AsynchronousServerSocketChannel

wangccsy 2019-12-02 01:46:51 0 浏览量 回答数 0

回答

学SQL语句性能的时候要注意非常重要一点: 不要用程序开发的思维思考数据库!! 在数据库中,SQL语句是一个抽象的概念,而不代表具体的实现。我举一个简单的例子,比如说A表和B表做连接,具体的Loop Join实现逻辑的伪代码为: for each row in t1 matching range { for each row in t2 matching reference key { for each row in t3 { if row satisfies join conditions, send to client } } } 而写SQL语句的时候,仅仅需要写select * from a inner join b on a.clo1=b.col2,该SQL语句仅仅写了你希望获得的结果,而没有写任何实现逻辑,因此SQL是无关实现的、抽象的。 那么具体如何执行在关系数据库中都有一个所谓的“优化器”实现,现代关系数据库的优化器是基于成本选择具体执行步骤(执行计划)的。因此妨碍优化器选择最优执行计划的SQL就不是好SQL。 首先提一下楼主举出文章的几点观点,我一个个纠正: 1. 选择最有效率的表名顺序。 这肯定是不对的,SQL优化器不会关心写表时,哪个表在前,哪个表在后,再次强调,SQL是抽象的、无关实现的。该语句在逻辑优化阶段优化器会自动选择最优的计划。 2. WHERE子句中的连接顺序 同上。 3. SELECT子句中避免使用 ‘ * ‘ 这一句话是正确的,但文章中提到: “实际上,在解析的过程中, 会将’’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.” 这种理解是错误的,解析号的成本几乎可以忽略不计。而更多的成本在于如下: 读取多余的列可能导致索引的书签查找,当读取条目多时会无法使用特定索引。 如果select 作用于表连接,可能造成更大的成本开销。 4. 计算记录条数 文章提到:count() 比count(1)稍快 这属于以讹传讹了,count()函数是聚合函数,指的是计算count()中所有非null的条目,count(1)和count(*)都是常量,意味着计算所有非空列。想象一下select 1 from 表,表中有10行的话就会返回10个1。count()同理,默认一般RDBMS会选择最窄的非Null列上的索引去统计具体条数。 5. 使用表的别名(Alias) 文中提到使用别名减少解析时间,我只能评论太有想象力了。 6. 用Where子句替换HAVING子句 这点的说法不合适,where和having是完全不同的子句,having的价值是使用聚合函数作为筛选条件中的一部分。没有谁替代谁一说。 那什么样的SQL语句是不好的语句呢: 那就是妨碍优化器更好的实现执行逻辑的SQL语句,这类语句包括: 1.where条件里出现各种花样百出的代码,比如函数、运算等。 2.语句过大,大量的表join会导致中间结果集不准确,从而限制优化器选择较好的执行计划。 等等......... 所以尝试尽量think like query optimizer,而不是think like programmer

茶什i 2020-01-13 11:47:16 0 浏览量 回答数 0

问题

MaxCompute百问集锦(持续更新20171011)

隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

问题

什么是Linux 实例常用内核网络参数介绍与常见问题处理

boxti 2019-12-01 22:01:36 2069 浏览量 回答数 0

回答

有时您的PDO代码会产生类似Call to a member function execute()或类似的错误。甚至没有任何错误,但查询不能完全一样。这意味着您的查询无法执行。 每次查询失败,MySQL都会显示一条错误消息,说明原因。不幸的是,默认情况下,此类错误不会转移到PHP,并且您所拥有的只是上面提到的无提示或神秘的错误消息。因此,配置PHP和PDO报告MySQL错误非常重要。一旦收到错误消息,解决该问题将变得很容易。 为了获得有关该问题的详细信息,请在连接后立即在代码中添加以下行 $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); ($dbh您的PDO实例变量的名称在哪里)或-更好-将此参数添加为连接选项。之后,所有数据库错误都将转换为PDO异常,如果不理会这些异常,则它们将像常规的PHP错误一样起作用。 如果发生某些特定错误,则极有可能不会引发异常。如果您的query()/ prepare()或execute()通话返回,false但没有例外,请PDO::errorInfo()像这样检查, trigger_error("PDO errorInfo: ".$dbh->errorInfo()); 得到错误消息后,您必须阅读并理解它。听起来似乎太明显了,但是学习者经常忽略错误消息的含义。但大多数情况下,它可以很直接地说明问题: 说,如果它说一个特定的表不存在,则必须检查拼写,错字,字母大小写。另外,您还必须确保您的PHP脚本连接到正确的数据库 或者,如果显示SQL语法有错误,则必须检查SQL。问题点就在错误消息中引用的查询部分之前。 您还必须信任错误消息。如果它说令牌的数量与绑定变量的数量不匹配,那就是。缺少表或列也是如此。如果有选择,无论是您自己的错误还是错误消息是错误的,请始终坚持前者。再次听起来是屈尊的,但是这个站点上的数百个问题证明了此建议非常有用。 请注意,为了查看PDO错误,您通常必须能够查看PHP错误。为此,您必须根据站点环境配置PHP: 在开发服务器上,很容易在屏幕上显示错误,因此必须打开显示错误: error_reporting(E_ALL); ini_set('display_errors',1); 在实时站点上时,必须记录所有错误,但永远不要显示给客户端。为此,可以这样配置PHP: error_reporting(E_ALL); ini_set('display_errors', 0); ini_set('log_errors', 1); 请注意,error_reporting应始终将其设置为E_ALL。 还要注意,尽管存在常见的妄想,但错误报告无需使用try-catch。PHP将以一种更好的形式报告您的PDO错误。未捕获的异常对于开发非常有用,但是如果您要显示自定义的错误页面,仍然不要为此使用try catch,而只需设置自定义错误处理程序即可。简而言之,您不必将PDO错误视为特殊错误,而是将它们视为代码中的任何其他错误。 PS 有时没有错误,但也没有结果。那就意味着,没有符合您条件的数据。因此,即使您可以保证数据和标准都正确,您也必须承认这一事实。他们不是。您必须再次检查它们。我有一篇文章,《如何调试与PDO的数据库交互》,可以对此提供帮助。只需按照此说明逐步进行操作,即可解决您的问题或对堆栈溢出有一个可解答的问题。来源:stack overflow

保持可爱mmm 2020-05-08 09:54:51 0 浏览量 回答数 0

回答

本文介绍AliSQL的内核版本更新说明。 MySQL 8.0 20200229 新特性 Performance Agent:更加便捷的性能数据统计方案。通过MySQL插件的方式,实现MySQL实例内部各项性能数据的采集与统计。 在半同步模式下添加网络往返时间,并记录到性能数据。 性能优化 允许在只读实例上进行语句级并发控制(CCL)操作。 备实例支持Outline。 Proxy短连接优化。 优化不同CPU架构下的pause指令执行时间。 添加内存表查看线程池运行情况。 Bug修复 在低于4.9的Linux Kenerls中禁用ppoll,使用poll代替。 修复wrap_sm4_encrypt函数调用错误问题。 修复在滚动审核日志时持有全局变量锁的问题。 修复恢复不一致性检查的问题。 修复io_statistics表出现错误time值的问题。 修复无效压缩算法导致崩溃的问题。 修复用户列与5.6不兼容的问题。 20200110 新特性 Inventory Hint:新增了三个hint, 支持SELECT、UPDATE、INSERT、DELETE 语句,快速提交/回滚事务,提高业务吞吐能力。 性能优化 启动实例时,先初始化Concurrency Control队列结构,再初始化Concurrency Control规则。 异步清除文件时继续取消小文件的链接。 优化Thread Pool性能。 默认情况下禁用恢复不一致性检查。 更改设置变量所需的权限: 设置以下变量所需的权限已更改为普通用户权限: auto_increment_increment auto_increment_offset bulk_insert_buffer_size binlog_rows_query_log_events 设置以下变量所需的权限已更改为超级用户或系统变量管理用户权限: binlog_format binlog_row_image binlog_direct sql_log_off sql_log_bin 20191225 新特性 Recycle Bin:临时将删除的表转移到回收站,还可以设置保留的时间,方便您找回数据。 性能优化 提高短连接处理性能。 使用专用线程为maintain user服务,避免HA失败。 通过Redo刷新Binlog时出现错误会显式释放文件同步锁。 删除不必要的TCP错误日志。 默认情况下启用线程池。 Bug修复 修复慢日志刷新的问题。 修复锁定范围不正确的问题。 修复TDE的Select函数导致的核心转储问题。 20191115 新特性 Statement Queue:针对语句的排队机制,将语句进行分桶排队,尽量把可能具有相同冲突的语句放在一个桶内排队,减少冲突的开销。 20191101 新特性 为TDE添加SM4加密算法。 保护备实例信息:拥有SUPER或REPLICATION_SLAVE_ADMIN权限的用户才能插入/删除/修改表slave_master_info、slave_relay_log_info、slave_worker_info。 提高自动递增键的优先级:如果表中没有主键或非空唯一键,具有自动增量的非空键将是第一候选项。 对系统表和处于初始化状态线程用到的表,不进行Memory引擎到MyISAM引擎的自动转换。 Redo Log刷新到磁盘之前先将Binlog文件刷新到磁盘。 实例被锁定时也会影响临时表。 添加新的基于LSM树的事务存储引擎X-Engine。 性能优化 Thread Pool:互斥优化。 Performance Insight:性能点支持线程池。 参数调整: primary_fast_lookup:会话参数,默认值为true。 thread_pool_enabled:全局参数,默认值为true。 20191015 新特性 TDE:支持透明数据加密TDE(Transparent Data Encryption)功能,可对数据文件执行实时I/O加密和解密,数据在写入磁盘之前进行加密,从磁盘读入内存时进行解密。 Returning:Returning功能支持DML语句返回Resultset,同时提供了工具包(DBMS_TRANS)便于您快捷使用。 强制将引擎从MyISAM/MEMORY转换为InnoDB:如果全局变量force_memory/mysiam_to_innodb为ON,则创建/修改表时会将表引擎从MyISAM/MEMORY转换为InnoDB。 禁止非高权限账号切换主备实例。 性能代理插件:收集性能数据并保存到本地格式化文本文件,采用文件轮循方式,保留最近的秒级性能数据。 Innodb mutex timeout cofigurable:可配置全局变量innodb_fatal_semaphore_wait_threshold,默认值:600。 忽略索引提示错误:可配置全局变量ignore_index_hint_error,默认值:false。 可关闭SSL加密功能。 TCP错误信息:返回TCP方向(读取、读取等待、写入等待)错误及错误代码到end_connection事件,并且输出错误信息到错误日志。 Bug修复 支持本地AIO的Linux系统内,在触发线性预读之前会合并AIO请求。 优化表/索引统计信息。 如果指定了主键,则直接访问主索引。 20190915 Bug修复 修复Cmd_set_current_connection内存泄露问题。 20190816 新特性 Thread Pool:将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃会话的任务即可。 Statement Concurrency Control:通过控制并发数应对突发的数据库请求流量、资源消耗过高的语句访问以及SQL访问模型的变化,保证MySQL实例持续稳定运行。 Statement Outline:利用Optimizer Hint和Index Hint让MySQL稳定执行计划。 Sequence Engine:简化获取序列值的复杂度。 Purge Large File Asynchronously:删除单个表空间时,会将表空间文件重命名为临时文件,等待异步清除进程清理临时文件。 Performance Insight:专注于实例负载监控、关联分析、性能调优的利器,帮助您迅速评估数据库负载,找到性能问题的源头,提升数据库的稳定性。 优化实例锁状态:实例锁定状态下,可以drop或truncate表。 Bug修复 修复文件大小计算错误的问题。 修复偶尔出现的内存空闲后再次使用的问题。 修复主机缓存大小为0时的崩溃问题。 修复隐式主键与CTS语句的冲突问题。 修复慢查询导致的slog出错问题。 20190601 性能优化 缩短日志表MDL范围,减少MDL阻塞的可能性。 重构终止选项的代码。 Bug修复 修复审计日志中没有记录预编译语句的问题。 屏蔽无效表名的错误日志。 MySQL 5.7基础版/高可用版 20200229 新特性 Performance Agent:更加便捷的性能数据统计方案。通过MySQL插件的方式,实现MySQL实例内部各项性能数据的采集与统计。 在半同步模式下添加网络往返时间,并记录到性能数据。 性能优化 优化不同CPU架构下的pause指令执行时间。 Proxy短连接优化。 添加内存表查看线程池运行情况。 Bug修复 修复DDL重做日志不安全的问题。 修复io_statistics表出现错误time值的问题。 修复更改表导致服务器崩溃的问题。 修复MySQL测试用例。 20200110 性能优化 异步清除文件时继续取消小文件的链接。 优化Thread Pool性能。 thread_pool_enabled参数的默认值调整为OFF。 20191225 新特性 内部账户管理与防范:调整用户权限保护数据安全。 性能优化 提高短连接处理性能。 使用专用线程为maintain user服务,避免HA失败。 删除不必要的TCP错误日志。 优化线程池。 Bug修复 修复读写分离时mysqld进程崩溃问题。 修复密钥环引起的核心转储问题。 20191115 Bug修复 修复主备切换后审计日志显示变量的问题。 20191101 新特性 为TDE添加SM4加密算法。 如果指定了主键,则直接访问主索引。 对系统表和处于初始化状态线程用到的表,不进行Memory引擎到MyISAM引擎的自动转换。 性能优化 Thread Pool:互斥优化。 引入审计日志缓冲机制,提高审计日志的性能。 Performance Insight:性能点支持线程池。 默认开启Thread Pool。 Bug修复 在处理维护用户列表时释放锁。 补充更多TCP错误信息。 20191015 新特性 轮换慢日志:为了在收集慢查询日志时保证零数据丢失,轮换日志表会将慢日志表的csv数据文件重命名为唯一名称并创建新文件。您可以使用show variables like '%rotate_log_table%';查看是否开启轮换慢日志。 性能代理插件:收集性能数据并保存到本地格式化文本文件,采用文件轮轮循方式,保留最近的秒级性能数据。 强制将引擎从MEMORY转换为InnoDB:如果全局变量rds_force_memory_to_innodb为ON,则创建/修改表时会将表引擎从MEMORY转换为InnoDB。 TDE机制优化:添加keyring-rds插件与管控系统/密钥管理服务进行交互。 TCP错误信息:返回TCP方向(读取、读取等待、写入等待)错误及错误代码到end_connection事件,并且输出错误信息到错误日志。 Bug修复 修复DDL中的意外错误Error 1290。 20190925 参数修改 将系统变量auto_generate_certs的默认值由true改为false。 增加全局只读变量auto_detact_certs,默认值为false,有效值为[true | false]。 该系统变量在Server端使用OpenSSL编译时可用,用于控制Server端在启动时是否在数据目录下自动查找SSL加密证书和密钥文件,即控制是否开启Server端的证书和密钥的自动查找功能。 20190915 新特性 Thread Pool:将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃会话的任务即可。 20190815 新特性 Purge Large File Asynchronously:删除单个表空间时,会将表空间文件重命名为临时文件,等待异步清除进程清理临时文件。 Performance Insight:专注于实例负载监控、关联分析、性能调优的利器,帮助您迅速评估数据库负载,找到性能问题的源头,提升数据库的稳定性。 优化实例锁状态:实例锁定状态下,可以drop或truncate表。 Bug修复 禁止在set rds_current_connection命令中设置rds_prepare_begin_id。 允许更改已锁定用户的信息。 禁止用关键字actual作为表名。 修复慢日志导致时间字段溢出的问题。 20190510版本 新特性:允许在事务内创建临时表。 20190319版本 新特性:支持在handshake报文内代理设置threadID。 20190131版本 升级到官方5.7.25版本。 关闭内存管理功能jemalloc。 修复内部变量net_lenth_size计算错误问题。 20181226版本 新特性:支持动态修改binlog-row-event-max-size,加速无主键表的复制。 修复Proxy实例内存申请异常的问题。 20181010版本 支持隐式主键。 加快无主键表的主备复制。 支持Native AIO,提升I/O性能。 20180431版本 新特性: 支持高可用版。 支持SQL审计。 增强对处于快照备份状态的实例的保护。 MySQL 5.7三节点企业版 20191128 新特性 支持读写分离。 Bug修复 修复部分场景下Follower Second_Behind_Master计算错误问题。 修复表级并行复制事务重试时死锁问题。 修复XA相关bug。 20191016 新特性 支持MySQL 5.7高可用版(本地SSD盘)升级到三节点企业版。 兼容MySQL官方GTID功能,默认不开启。 合并AliSQL MySQL 5.7基础版/高可用版 20190915版本及之前的自研功能。 Bug修复 修复重置备实例导致binlog被关闭问题。 20190909 新特性 优化大事务在三节点强一致状态下的执行效率。 支持从Leader/Follower进行Binlog转储。 支持创建只读实例。 系统表默认使用InnoDB引擎。 Bug修复 修复Follower日志清理命令失效问题。 修复参数slave_sql_verify_checksum=OFF和binlog_checksum=crc32时Slave线程异常退出问题。 20190709 新特性 支持三节点功能。 禁用semi-sync插件。 支持表级并行复制、Writeset并行复制。 支持pk_access主键查询加速。 支持线程池。 合并AliSQL MySQL 5.7基础版/高可用版 20190510版本及之前的自研功能。 MySQL 5.6 20200229 新特性 支持Proxy读写分离功能。 性能优化 优化线程池功能。 优化不同CPU架构下的pause指令执行时间。 Bug修复 修复XA事务部分提交的问题。 20200110 新特性 Thread Pool:将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃会话的任务即可。 性能优化 异步清除文件时继续取消小文件的链接。 Bug修复 修复页面清理程序的睡眠时间计算不正确问题。 修复SELECT @@global.gtid_executed导致的故障转移失败问题。 修复IF CLIENT KILLED AFTER ROLLBACK TO SAVEPOINT PREVIOUS STMTS COMMITTED问题。 20191212 性能优化 删除不必要的tcp错误日志 20191115 Bug修复 修复慢日志时间戳溢出问题。 20191101 Bug修复 修复刷新日志时切换慢日志的问题,仅在执行刷新慢日志时切换慢日志。 修正部分显示错误。 20191015 新特性 轮换慢日志:为了在收集慢查询日志时保证零数据丢失,轮换日志表会将慢日志表的csv数据文件重命名为唯一名称并创建新文件。您可以使用show variables like '%rotate_log_table%';查看是否开启轮换慢日志。 SM4加密算法:添加新的SM4加密算法,取代旧的SM加密算法。 Purge Large File Asynchronously:删除单个表空间时,会将表空间文件重命名为临时文件,等待异步清除进程清理临时文件。 TCP错误信息:返回TCP方向(读取、读取等待、写入等待)错误及错误代码到end_connection事件,并且输出错误信息到错误日志。 引入审计日志缓冲机制,提高审计日志的性能。。 Bug修复 禁用pstack,避免存在大量连接时可能导致pstack无响应。 修复隐式主键与create table as select语句之间的冲突。 自动清除由二进制日志创建的临时文件。 20190815 优化实例锁状态:实例锁定状态下,可以drop或truncate表。 20190130版本 修复部分可能导致系统不稳定的bug。 20181010版本 添加参数rocksdb_ddl_commit_in_the_middle(MyRocks)。如果这个参数被打开,部分DDL在执行过程中将会执行commit操作。 201806** (5.6.16)版本 新特性:slow log精度提升为微秒。 20180426(5.6.16)版本 新特性:引入隐藏索引,支持将索引设置为不可见,详情请参见参考文档。 修复备库apply线程的bug。 修复备库apply分区表更新时性能下降问题。 修复TokuDB下alter table comment重建整张表问题,详情请参见参考文档。 修复由show slave status/show status可能触发的死锁问题。 20171205(5.6.16)版本 修复OPTIMIZE TABLE和ONLINE ALTER TABLE同时执行时会触发死锁的问题。 修复SEQUENCE与隐含主键冲突的问题。 修复SHOW CREATE SEQUENCE问题。 修复TokuDB引擎的表统计信息错误。 修复并行OPTIMIZE表引入的死锁问题。 修复QUERY_LOG_EVENT中记录的字符集问题。 修复信号处理引起的数据库无法停止问题,详情请参见参考文档。 修复RESET MASTER引入的问题。 修复备库陷入等待的问题。 修复SHOW CREATE TABLE可能触发的进程崩溃问题。 20170927(5.6.16)版本 修复TokuDB表查询时使用错误索引问题。 20170901(5.6.16)版本 新特性: 升级SSL加密版本到TLS 1.2,详情请参见参考文档。 支持Sequence。 修复NOT IN查询在特定场景下返回结果集有误的问题。 20170530 (5.6.16)版本 新特性:支持高权限账号Kill其他账号下的连接。 20170221(5.6.16)版本 新特性:支持读写分离简介。 MySQL 5.5 20181212 修复调用系统函数gettimeofday(2) 返回值不准确的问题。该系统函数返回值为时间,常用来计算等待超时,时间不准确时会导致一些操作永不超时。

游客yl2rjx5yxwcam 2020-03-08 13:18:55 0 浏览量 回答数 0

回答

12月17日更新 请问下同时消费多个topic的情况下,在richmap里面可以获取到当前消息所属的topic吗? 各位大佬,你们实时都是怎样重跑数据的? 有木有大神知道Flink能否消费多个kafka集群的数据? 这个问题有人遇到吗? 你们实时读取广业务库到kafka是通过什么读的?kafka connector 的原理是定时去轮询,这样如果表多了,会不会影响业务库的性能?甚至把业务库搞挂? 有没有flink 1.9 连接 hive的例子啊?官网文档试了,没成功 请问各位是怎么解决实时流数据倾斜的? 请问一下,对于有状态的任务,如果任务做代码升级的时候,可否修改BoundedOutOfOrdernessTimestampExtractor的maxOutOfOrderness呢?是否会有影响数据逻辑的地方呢? 老哥们有做过统计从0点开始截止到现在时刻的累计用户数吗? 比如五分钟输出一次,就是7点输出0点到7点的累计用户,7:05输出0点到7:05的累计用户。 但是我这里有多个维度,现在用redis来做的。 想知道有没有更好的姿势? 实时数仓用什么存储介质来存储维表,维表有大有小,大的大概5千万左右。 各位大神有什么建议和经验分享吗? 请教个问题,就是flink的窗口触发必须是有数据才会触发吗?我现在有个这样的需求,就是存在窗口内没有流数据进入,但是窗口结束是要触发去外部系统获取上一个窗口的结果值作为本次窗口的结果值!现在没有流数据进入窗口结束时如何触发? kafkaSource.setStartFromTimestamp(timestamp); 发现kafkasource从指定时间开始消费,有些topic有效,有效topic无效,大佬们有遇到过吗? 各位大佬,flink两个table join的时候,为什么打印不出来数据,已经赋了关联条件了,但是也不报错 各位大佬 请教一下 一个faile的任务 会在这里面存储展示多久啊? 各位大佬,我的程序每五分钟一个窗口做了基础指标的统计,同时还想统计全天的Uv,这个是用State就能实现吗? 大佬们,flink的redis sink是不是只适用redis2.8.5版本? 有CEP 源码中文注释的发出来学习一下吗? 有没有拿flink和tensorflow集成的? 那位大神,给一个java版的flink1.7 读取kafka数据,做实时监控和统计的功能的代码案例。 请问下风控大佬,flink为风控引擎做数据支撑的时候,怎么应对风控规则的不断变化,比如说登录场景需要实时计算近十分钟内登录次数超过20次用户,这个规则可能会变成计算近五分钟内登录次数超过20次的。 想了解一下大家线上Flink作业一般开始的时候都分配多少内存?广播没办法改CEP flink支持多流(大于2流)join吗? 谁能帮忙提供一下flink的多并行度的情况下,怎么保证数据有序 例如map并行度为2 那就可能出现数据乱序的情况啊 请教下现在从哪里可以可以看单任务的运行状况和内存占用情况,flink页面上能看单个任务的内存、cpu 大佬们 flink1.9 停止任务手动保存savepoint的命令是啥? flink 一个流计算多个任务和 还是一个流一个任务好? flink 1.9 on yarn, 自定义个connector里面用了jni, failover以后 就起不来了, 报错重复load so的问题。 我想问一下 这个,怎么解决。 难道flink 里面不能用jni吗。 ide里面调试没有问题,部署到集群就会报错了,可能什么问题? 请教一下对于长时间耗内存很大的任务,大家都是开checkpoint机制,采用rocksdb做状态后端吗? 请问下大佬,flink jdbc读取mysql,tinyin字段类型自动转化为Boolean有没有好的解决方法 Flink 1.9版本的Blink查询优化器,Hive集成,Python API这几个功能好像都是预览版,请问群里有大佬生产环境中使用这些功能了吗? 想做一个监控或数据分析的功能,如果我flink 的datastreaming实现消费Kafka的数据,但是我监控的规则数据会增加或修改,但是不想停这个正在运行的flink程序,要如何传递这个动态变化的规则数据,大神给个思路,是用ConnectedStream这个吗?还是用Broadcast ?还有一个,比如我的规则数据是存放在Mysql表中,用什么事件隔30秒去触发读取mysql规则表呢?谢谢! 想做一个监控或数据分析的功能,如果我flink 的datastreaming实现消费Kafka的数据,但是我监控的规则数据会增加或修改,但是不想停这个正在运行的flink程序,要如何传递这个动态变化的规则数据,大神给个思路,是用ConnectedStream这个吗?还是用Broadcast ?还有一个,比如我的规则数据是存放在Mysql表中,用什么事件隔30秒去触发读取mysql规则表呢?谢谢! 各位大佬,在一个 Job 计算过程中,查询 MySQL 来补全额外数据,是一个好的实践嘛?还是说流处理过程中应该尽量避免查询额外的数据? Flink web UI是jquery写的吗? 12月9日更新 成功做完一次checkpoint后,会覆盖上一次的checkpoint吗? 数据量较大时,flink实时写入hbase能够异步写入吗? flink的异步io,是不是只是适合异步读取,并不适合异步写入呀? 请问一下,flink将结果sink到redis里面会不会对存储的IO造成很大的压力,如何批量的输出结果呢? 大佬们,flink 1.9.0版本里DataStream api,若从kafka里加载完数据以后,从这一个流中获取数据进行两条业务线的操作,是可以的吗? flink 中的rocksdb状态怎么样能可视化的查看有大佬知道吗? 感觉flink 并不怎么适合做hive 中的计算引擎来提升hive 表的查询速度 大佬们,task端rocksdb状态 保存路径默认是在哪里的啊?我想挂载个新磁盘 把状态存到那里去 flink 的state 在窗口滑动到下一个窗口时候 上一个窗口销毁时候 state会自己清除吗? 求助各位大佬,一个sql里面包含有几个大的hop滑动窗口,如15个小时和24个小时,滑动步长为5分钟,这样就会产生很多overlap 数据,导致状态会很快就达到几百g,然后作业内存也很快达到瓶颈就oom了,然后作业就不断重启,很不稳定,请问这个业务场景有什么有效的解决方案么? 使用jdbcsink的时候,如果连接长时间不使用 就会被关掉,有人遇到过吗?使用的是ddl的方式 如何向云邪大佬咨询FLink相关技术问题? 请问各位公司有专门开发自己的实时计算平台的吗? 请问各位公司有专门开发自己的实时计算平台的吗? 有哪位大佬有cdh集成安装flink的文档或者手册? 有哪位大佬有cdh集成安装flink的文档或者手册? 想问下老哥们都是怎么统计一段时间的UV的? 是直接用window然后count嘛? Flink是不是也是这样的? 请问现在如有个实时程序,根据一个mysql的维表来清洗,但是我这个mysql表里面就只有几条信息且可能会变。 我想同一个定时器去读mysql,然后存在对象中,流清洗的时候读取这个数据,这个想法可行吗?我目前在主类里面定义一个对象,然后往里面更新,发现下面的map方法之类的读不到我更新进去的值 有大佬做过flink—sql的血缘分析吗? 12月3日更新 请教一下,为什么我flume已经登录成功了keytab认证的kafka集群,但是就是消费不到数据呢? flink 写入mysql 很长一段时间没有写入,报错怎么解决呢? flink timestamp转换为date类型,有什么函数吗 Run a single Flink job on YARN 我采用这种模式提交任务,出现无法找到 开启 HA 的ResourceManager Failed to connect to server: xxxxx:8032: retries get failed due to exceeded maximum allowed retries number: 0 有大佬遇到过吗 ? 各位大佬,请问有Flink写S3的方案吗? flink 连接hbase 只支持1.4.3版本? onnector: type: hbase version: "1.4.3" 请问 flink1.9能跑在hadoop3集群上吗? 滑动窗口 排序 报错这个是什么原因呢? 这个pravega和kafka有啥区别? flink 开发里数据源配置了RDS,但是在RDS里没有看到创建的表,是为什么呢? Tumbling Window里的数据,是等窗口期内的数据到齐之后一次性处理,还是到了一条就处理一条啊 双流join后再做time window grouping. 但是双流join会丢失时间属性,请问大家如何解决 stream processing with apache flink,这本书的中译版 现在可以买吗? flink on yarn时,jm和tm占用的内存最小是600M,这个可以修改吗? 各位大佬,使用默认的窗口Trigger,在什么情况下会触发两次啊?窗口关闭后,然后还来了这个窗口期内的数据,并且开了allowedLateness么? flink web里可以像storm那样 看每条数据在该算子中的平均耗时吗? 各位大佬,flink任务的并发数调大到160+以后,每隔几十分钟就会出现一次TM节点连接丢失的异常,导致任务重启。并发在100时运行比较稳定,哪位大佬可以提供下排查的思路? 感觉stateful function 是下一个要发力的点,这个现在有应用案例吗? 我有2个子网(a子网,b子网)用vpn联通,vpn几周可能会断一次。a子网有一个kafka集群,b子网运行我自己的flink集群和应用,b子网的flink应用连接到a子网的kafka集群接收消息来处理入库到数仓去。我的问题是,如果vpn断开,flink consumer会异常整个作业退出吗?如果作业退出,我重连vpn后,能从auto checkpoint再把flink应用恢复到出错时flink kafka consumer应该读取的partition/offset位置吗?flink的checkpoint除了保存自己开发的算子里的state,kafkaconsumer里的partition/offset也会保存和恢复吗? flink的反压为什么不加入metrics呢 hdfs是不是和flink共用一个集群? flink消费kafka,可以从指定时间消费的吗?目前提供的接口只是根据offset消费?有人知道怎么处理? flink 的Keyby是不是只是repartition而已?没有将key相同的数据放到一个组合里面 电商大屏 大家推荐用什么来做吗? 我比较倾向用数据库,因为有些数据需要join其他表,flink充当了什么角色,对这个有点迷,比如统计当天订单量,卖了多少钱,各个省的销量,销售金额,各个品类的销售量销售金额 开源1.9的sql中怎么把watermark给用起来,有大神知道吗? 有没有人能有一些flink的教程 代码之类的分享啊 采用了checkpoint,程序停止了之后,什么都不改,直接重启,还是能接着继续运行吗?如果可以的话,savepoint的意义又是什么呢? 有人做过flink 的tpc-ds测试吗,能不能分享一下操作的流程方法 checkpoint是有时间间隔的,也就可以理解为checkpoint是以批量操作的,那如果还没进行ckecnpoint就挂了,下次从最新的一次checkpoint重启,不是重复消费了? kafka是可以批量读取数据,但是flink是一条一条处理的,应该也可以一条一条提交吧。 各位大佬,flink sql目前是不是不支持tumbling window join,有人了解吗? 你们的HDFS是装在taskmanager上还是完全分开的,请问大佬们有遇到这种情况吗? 大佬们flink检查点存hdfs的话怎么自动清理文件啊 一个128M很快磁盘就满了 有谁遇到过这个问题? 请教一下各位,这段代码里面,我想加一个trigger,实现每次有数据进window时候,就输出,而不是等到window结束再输出,应该怎么加? 麻烦问下 flink on yarn 执行 客户端启动时 报上面错,是什么原因造成的 求大佬指点 ERROR org.apache.flink.client.program.rest.RestClusterClient - Error while shutting down cluster java.util.concurrent.ExecutionException: org.apache.flink.runtime.concurrent.FutureUtils$RetryException: Could not complete the operation. Number of retries has been exhausted. 大家怎么能动态的改变 flink WindowFunction 窗口数据时间 flink on yarn之后。yarn的日志目录被写满,大家如配置的? Flink1.9 启动 yarn-session报这个错误 怎么破? yarn 模式下,checkpoint 是存在 JobManager的,提交任务也是提交给 JobManager 的吧? heckpoint机制,会不会把window里面的数据全部放checkpoint里面? Flink On Yarn的模式下,如果通过REST API 停止Job,并触发savepiont呢 jenkins自动化部署flink的job,一般用什么方案?shell脚本还是api的方式? 各位大佬,开启增量checkpoint 情况下,这个state size 是总的checkpoint 大小,还是增量上传的大小? 想用状态表作为子表 外面嵌套窗口 如何实现呢 因为状态表group by之后 ctime会失去时间属性,有哪位大佬知道的? 你们有试过在同样的3台机器上部署两套kafka吗? 大家有没有比较好的sql解析 组件(支持嵌套sql)? richmapfuntion的open/close方法,和处理数据的map方法,是在同一个线程,还是不同线程调用的? flink on yarn 提交 参数 -p 20 -yn 5 -ys 3 ,我不是只启动了5个container么? Flink的乱序问题怎么解决? 我对数据流先进行了keyBy,print的时候是有数据的,一旦进行了timeWindow滑动窗口就没有数据了,请问是什么情况呢? 搭建flinksql平台的时候,怎么处理udf的呀? 怎么查看sentry元数据里哪些角色有哪些权限? 用java api写的kafka consumer能消费到的消息,但是Flink消费不到,这是为啥? 我state大小如果为2G左右 每次checkpoint会不会有压力? link-table中的udaf能用deltaTrigger么? flink1.7.2,场景是一分钟为窗口计算每分钟传感器的最高温度,同时计算当前分钟与上一分钟最高温 001 Flink集群支持kerberos认证吗?也就是说flink客户端需要向Flink集群进行kerberos认证,认证通过之后客户端才能提交作业到Flink集群运行002 Flink支持多租户吗? 如果要对客户端提交作业到flink进行访问控制,你们有类似的这种使用场景吗? flink可以同时读取多个topic的数据吗? Flink能够做实时ETL(oracle端到oracle端或者多端)么? Flink是否适合普通的关系型数据库呢? Flink是否适合普通的关系型数据库呢? 流窗口关联mysql中的维度表大佬们都是怎么做的啊? 怎么保证整个链路的exactly one episode精准一次,从source 到flink到sink? 在SQL的TUMBLE窗口的统计中,如果没数据进来的,如何让他也定期执行,比如进行count计算,让他输出0? new FlinkKafkaConsumer010[String]("PREWARNING",new JSONKeyValueDeserializationSchema(true), kafkaProps).setStartFromGroupOffsets() ) 我这样new 它说要我传个KeyedDeserializationSchema接口进去 flink里面broadcast state想定时reload怎么做?我用kafka里的stream flink独立模式高可用搭建必需要hadoop吗? 有人用增量cleanupIncrementally的方式来清理状态的嘛,感觉性能很差。 flink sink to hbase继承 RichOutputFormat运行就报错 kafka 只有低级 api 才拿得到 offset 吗? 有个问题咨询下大家,我的flinksql中有一些参数是要从mysql中获取的,比如我flink的sql是select * from aa where cc=?,这个问号的参数需要从mysql中获取,我用普通的jdbc进行连接可以获的,但是有一个问题,就是我mysql的数据改了之后必须重启flink程序才能解决这个问题,但这肯定不符合要求,请问大家有什么好的办法吗? flink里怎样实现多表关联制作宽表 flink写es,因为半夜es集群做路由,导致写入容易失败,会引起source的反压,然后导致checkpoint超时任务卡死,请问有没有办法在下游es处理慢的时候暂停上游的导入来缓解反压? flink 写parquet 文件,使用StreamingFileSink streamingFileSink = StreamingFileSink.forBulkFormat( new Path(path), ParquetAvroWriters.forReflectRecord(BuyerviewcarListLog.class)). withBucketAssigner(bucketAssigner).build(); 报错 java.lang.UnsupportedOperationException: Recoverable writers on Hadoop are only supported for HDFS and for Hadoop version 2.7 or newer 1.7.2 NoWindowInnerJoin这个实现,我看实现了CleanupState可更新过期时间删除当前key状态的接口,是不是这个1.7.2版本即使有个流的key一直没有被匹配到他的状态也会被清理掉,就不会存在内存泄漏的问题了? flink1.7.2 想在Table的UDAF中使用State,但是发现UDAF的open函数的FunctionContext中对于RuntimeContext是一个private,无法使用,大佬,如何在Table的UDAF中使用State啊? Flink有什么性能测试工具吗? 项目里用到了了KafkaTableSourceSinkFactory和JDBCTableSourceSinkFactory。maven打包后,META-INF里只会保留第一个 标签的org.apache.flink.table.factories.TableFactory内容。然后执行时就会有找不到合适factory的报错,请问有什么解决办法吗? 为什么这个这段逻辑 debug的时候 是直接跳过的 各位大佬,以天为单位的窗口有没有遇到过在八点钟的时候会生成一条昨天的记录? 想问一下,我要做一个规则引擎,需要动态改变规则,如何在flink里面执行? flink-1.9.1/bin/yarn-session.sh: line 32: construc 我要用sql做一个规则引擎,需要动态改变规则,如何在flink里面执行? 我要用sql做一个规则引擎,需要动态改变规则,如何在flink里面执行? 一般公司的flink job有没有进程进行守护?有专门的工具或者是自己写脚本?这种情况针对flink kafka能不能通过java获取topic的消息所占空间大小? Flink container was removed这个咋解决的。我有时候没有数据的时候也出现这 大家有没有这种场景,数据从binlog消费,这个信息是订单信息,同一个订单id,会有不同状态的变更 问大家个Hive问题,新建的hive外部分区表, 怎么把HDFS数据一次性全部导入hive里 ? flink里面的broadcast state值,会出现broad流的数据还没put进mapstat Flink SQL DDL 创建表时,如何定义字段的类型为proctime? 请问下窗口计算能对历史数据进行处理吗?比如kafka里的写数据没停,窗口计算的应用停掉一段时间再开起 请问下,想统计未退费的订单数量,如果一个订单退费了(发过来一个update流),flink能做到对结果进行-1吗,这样的需求sql支持吗? 使用Flink sql时,对table使用了group by操作。然后将结果转换为流时是不是只能使用的toRetractStream方法不能使用toAppendStream方法。 百亿数据实时去重,有哪位同学实践过吗? 你们的去重容许有误差?因为bloom filter其实只能给出【肯定不存在】和【可能存在】两种结果。对于可能存在这种结果,你们会认为是同一条记录? 我就运行了一个自带的示例,一运行就报错然后web页面就崩了 flink定时加载外部数据有人做过吗? NoSuchMethodError: org.apache.flink.api.java.Utils.resolveFactory(Ljava/lang/ThreadLocal;Ljava/lang/Object;)Ljava/util/Optional 各位知道这个是那个包吗? flink 可以把大量数据写入mysql吗?比如10g flink sql 解析复杂的json可以吗? 在页面上写规则,用flink执行,怎么传递给flink? 使用cep时,如何动态添加规则? 如何基于flink 实现两个很大的数据集的交集 并集 差集? flink的应用场景是?除了实时 各位好,请教一下,滑动窗口,每次滑动都全量输出结果,外部存储系统压力大,是否有办法,只输出变化的key? RichSinkFunction close只有任务结束时候才会去调用,但是数据库连接一直拿着,最后成了数据库连接超时了,大佬们有什么好的建议去处理吗?? 为啥我的自定义函数注册,然后sql中使用不了? 请问一下各位老师,flink flapmap 中的collector.collect经常出现Buffer pool is destroyed可能是什么原因呢? 用asyncIO比直接在map里实现读hbase还慢,在和hbase交互这块儿,每个算子都加了时间统计 请教一下,在yarn上运行,会找不到 org.apache.flink.streaming.util 请问下大佬,flink1.7.2对于sql的支持是不是不怎么好啊 ,跑的数据一大就会报错。 各位大佬,都用什么来监控flink集群? flink 有那种把多条消息聚合成一条的操作吗,比如说每五十条聚合成一条 如何可以让checkpoint 跳过对齐呢? 请问 阿里云实时计算(Blink)支持这4个源数据表吗?DataHub Kafka MQ MaxCompute? 为啥checkpoint时间会越来越长,请问哪位大佬知道是因为啥呢? 请问Flink的最大并行度跟kafka partition数量有关系吗? source的并行度应该最好是跟partition数量一致吧,那剩下的算子并行度呢? Flink有 MLIB库吗,为什么1.9中没有了啊? 请教一下,有没有flink ui的文章呢?在这块内存配置,我给 TM 配置的内存只有 4096 M,但是这里为什么对不上呢?请问哪里可以看 TM 内存使用了多少呢? 请教个问题,fink RichSinkFunction的invoke方法是什么时候被调用的? 请教一下,flink的window的触发条件 watermark 小于 window 的 end_time。这个 watermark 为什么是针对所有数据的呢?没有设计为一个 key 一个 watermark 呢? 就比如说有 key1、key2、key3,有3个 watermark,有 3个 window interval不支持left join那怎么可以实现把窗口内左表的数据也写到下游呢? 各位 1、sink如何只得到最终的结果而不是也输出过程结果 ;2、不同的运算如何不借助外部系统的存储作为另外一个运算的source 请教各位一个问题,flink中设置什么配置可以取消Generic这个泛型,如图报错: 有大佬在吗,线上遇到个问题,但是明明内存还有200多G,然后呢任务cancel不了,台也取消不了程序 flink遇到The assigned slot container_1540803405745_0094_01_000008_1 was removed. 有木有大佬遇到过。在flink on yarn上跑 这个报错是什么意思呢?我使用滑动窗口的时候出现报错 flink 双流union状态过期不清理有遇到的吗? 大家有没有这种场景,数据从binlog消费,这个信息是订单信息,同一个订单id,会有不同状态的变更,如果订单表与商品明细join查询,就会出现n条重复数据,这样数据就不准了,flink 这块有没有比较好的实战经验的。 大佬们、有没有人遇到过使用一分钟的TumblingEventTimeWindows,但是没有按时触发窗口、而是一直等到下一条消息进来之后才会把这个窗口的数据发送出去的? flink 有办法 读取 pytorch的 模型文件吗? 大佬们、有没有人遇到过使用一分钟的TumblingEventTimeWindows,但是没有按时触发窗口、而是一直等到下一条消息进来之后才会把这个窗口的数据发送出去的? flink timestamp转换为date类型,有什么函数吗 flink 写入mysql 很长一段时间没有写入,报错怎么解决呢? flink 有办法 读取 pytorch的 模型文件吗? 有没有大佬知道实时报表怎么做?就是统计的结果要实时更新,热数据。 刚接触flink 1.9 求问flink run脚本中怎么没有相关提交到yarn的命令了 请教一下,flink里怎么实现batch sink的操作而不导致数据丢失

问问小秘 2019-12-02 03:19:17 0 浏览量 回答数 0

问题

【精品问答】python百大常见问题与答案详解

祖安文状元 2020-02-24 17:56:41 363 浏览量 回答数 1

问题

SaaS模式云数据仓库MaxCompute 百问百答合集(持续更新20200921)

亢海鹏 2020-05-29 15:10:00 19050 浏览量 回答数 5

问题

【精品问答】不懂如何使用ECS?ECS功能百问看这里

问问小秘 2020-01-02 15:48:11 7480 浏览量 回答数 4

问题

PHP环境安全加固

正禾 2019-12-01 22:10:17 3281 浏览量 回答数 0

回答

一、软件篇 1、设定虚拟内存 硬盘中有一个很宠大的数据交换文件,它是系统预留给虚拟内存作暂存的地方,很多应用程序都经常会使用到,所以系统需要经常对主存储器作大量的数据存取,因此存取这个档案的速度便构成影响计算机快慢的非常重要因素!一般Windows预设的是由系统自行管理虚拟内存,它会因应不同程序所需而自动调校交换档的大小,但这样的变大缩小会给系统带来额外的负担,令系统运作变慢!有见及此,用户最好自定虚拟内存的最小值和最大值,避免经常变换大小。要设定虚拟内存,在“我的电脑”上按右键选择“属性”,在“高级”选项里的“效能”的对话框中,对“虚拟内存”进行设置。 3、检查应用软件或者驱动程序 有些程序在电脑系统启动会时使系统变慢。如果要是否是这方面的原因,我们可以从“安全模式”启动。因为这是原始启动,“安全模式”运行的要比正常运行时要慢。但是,如果你用“安全模式”启动发现电脑启动速度比正常启动时速度要快,那可能某个程序是导致系统启动速度变慢的原因。 4、桌面图标太多会惹祸 桌面上有太多图标也会降低系统启动速度。Windows每次启动并显示桌面时,都需要逐个查找桌面快捷方式的图标并加载它们,图标越多,所花费的时间当然就越多。同时有些杀毒软件提供了系统启动扫描功能,这将会耗费非常多的时间,其实如果你已经打开了杀毒软件的实时监视功能,那么启动时扫描系统就显得有些多余,还是将这项功能禁止吧! 建议大家将不常用的桌面图标放到一个专门的文件夹中或者干脆删除! 5、ADSL导致的系统启动变慢 默认情况下Windows XP在启动时会对网卡等网络设备进行自检,如果发现网卡的IP地址等未配置好就会对其进行设置,这可能是导致系统启动变慢的真正原因。这时我们可以打开“本地连接”属性菜单,双击“常规”项中的“Internet协议”打开“TCP/IP属性”菜单。将网卡的IP地址配置为一个在公网(默认的网关是192.168.1.1)中尚未使用的数值如192.168.1.X,X取介于2~255之间的值,子网掩码设置为255.255.255.0,默认网关和DNS可取默认设置。 6、字体对速度的影响 虽然 微软 声称Windows操作系统可以安装1000~1500种字体,但实际上当你安装的字体超过500 种时,就会出现问题,比如:字体从应用程序的字体列表中消失以及Windows的启动速度大幅下降。在此建议最好将用不到或者不常用的字体删除,为避免删除后发生意外,可先进行必要的备份。 7、删除随机启动程序 何谓随机启动程序呢?随机启动程序就是在开机时加载的程序。随机启动程序不但拖慢开机时的速度,而且更快地消耗计算机资源以及内存,一般来说,如果想删除随机启动程序,可去“启动”清单中删除,但如果想详细些,例如是QQ、popkiller 之类的软件,是不能在“启动”清单中删除的,要去“附属应用程序”,然后去“系统工具”,再去“系统信息”,进去后,按上方工具列的“工具”,再按“系统组态编辑程序”,进去后,在“启动”的对话框中,就会详细列出在启动电脑时加载的随机启动程序了!XP系统你也可以在“运行”是输入Msconfig调用“系统配置实用程序”才终止系统随机启动程序,2000系统需要从XP中复制msconfig程序。 8、取消背景和关闭activedesktop 不知大家有否留意到,我们平时一直摆放在桌面上漂亮的背景,其实是很浪费计算机资源的!不但如此,而且还拖慢计算机在执行应用程序时的速度!本想美化桌面,但又拖慢计算机的速度,这样我们就需要不在使用背景了,方法是:在桌面上按鼠标右键,再按内容,然后在“背景”的对话框中,选“无”,在“外观”的对话框中,在桌面预设的青绿色,改为黑色......至于关闭activedesktop,即是叫你关闭从桌面上的web画面,例如在桌面上按鼠标右键,再按内容,然后在“背景”的对话框中,有一幅背景,名为Windows XX,那副就是web画面了!所以如何系统配置不高就不要开启。 10、把Windows变得更苗条 与DOS系统相比,Windows过于庞大,而且随着你每天的操作,安装新软件、加载运行库、添加新游戏等等使得它变得更加庞大,而更为重要的是变大的不仅仅是它的目录,还有它的 注册表 和运行库。因为即使删除了某个程序,可是它使用的DLL文件仍然会存在,因而随着使用日久,Windows的启动和退出时需要加载的DLL动态链接库文件越来越大,自然系统运行速度也就越来越慢了。这时我们就需要使用一些彻底删除DLL的程序,它们可以使Windows恢复苗条的身材。建议极品玩家们最好每隔两个月就重新安装一遍Windows,这很有效。 11、更改系统开机时间 虽然你已知道了如何新增和删除一些随机启动程序,但你又知不知道,在开机至到进入Windows的那段时间,计算机在做着什么呢?又或者是,执行着什么程序呢?那些程序,必定要全部载完才开始进入Windows,你有否想过,如果可删除一些不必要的开机时的程序,开机时的速度会否加快呢?答案是会的!想要修改,可按"开始",选"执行",然后键入win.ini,开启后,可以把以下各段落的内容删除,是删内容,千万不要连标题也删除!它们包括:[compatibility]、[compatibility32]、[imecompatibility]、[compatibility95]、[modulecompatibility]和[embedding]。 二、硬件篇 1、Windows系统自行关闭硬盘DMA模式 硬盘的DMA模式大家应该都知道吧,硬盘的PATA模式有DMA33、DMA66、DMA100和DMA133,最新的SATA-150都出来了!一般来说现在大多数人用的还是PATA模式的硬盘,硬盘使用DMA模式相比以前的PIO模式传输的速度要快2~8倍。DMA模式的起用对系统的性能起到了实质的作用。但是你知道吗?Windows 2000、XP、2003系统有时会自行关闭硬盘的DMA模式,自动改用PIO模式运行!这就造成在使用以上系统中硬盘性能突然下降,其中最明显的现象有:系统起动速度明显变慢,一般来说正常Windows XP系统启动时那个由左向右运动的滑条最多走2~4次系统就能启动,但这一问题发生时可能会走5~8次或更多!而且在运行系统时进行硬盘操作时明显感觉变慢,在运行一些大的软件时CPU占用率时常达到100%而产生停顿,玩一些大型3D游戏时画面时有明显停顿,出现以上问题时大家最好看看自己硬盘的DMA模式是不是被Windows 系统自行关闭了。查看自己的系统是否打开DMA模式: a. 双击“管理工具”,然后双击“计算机管理”; b. 单击“系统工具”,然后单击“设备管理器”; c. 展开“IDE ATA/ATAPI 控制器”节点; d. 双击您的“主要IDE控制器”; 2、CPU 和风扇是否正常运转并足够制冷 当CPU风扇转速变慢时,CPU本身的温度就会升高,为了保护CPU的安全,CPU就会自动降低运行频率,从而导致计算机运行速度变慢。有两个方法检测CPU的温度。你可以用“手指测法”用手指试一下处理器的温度是否烫手,但是要注意的是采用这种方法必须先拔掉电源插头,然后接一根接地线来防止身上带的静电击穿CPU以至损坏。另一个比较科学的方法是用带感温器的万用表来检测处理器的温度。 因为处理器的种类和型号不同,合理温度也各不相同。但是总的来说,温度应该低于 110 度。如果你发现处理器的测试高于这处温度,检查一下机箱内的风扇是否正常运转。 3、USB和扫描仪造成的影响 由于Windows 启动时会对各个驱动器(包括光驱)进行检测,因此如果光驱中放置了光盘,也会延长电脑的启动时间。所以如果电脑安装了扫描仪等设备,或在启动时已经连接了USB硬盘,那么不妨试试先将它们断开,看看启动速度是不是有变化。一般来说,由于USB接口速度较慢,因此相应设备会对电脑启动速度有较明显的影响,应该尽量在启动后再连接USB设备。如果没有USB设备,那么建议直接在BIOS设置中将USB功能关闭。 4、是否使用了磁盘压缩 因为“磁盘压缩”可能会使电脑性能急剧下降,造成系统速度的变慢。所以这时你应该检测一下是否使用了“磁盘压缩”,具体操作是在“我的电脑”上点击鼠标右键,从弹出的菜单选择“属性”选项,来检查驱动器的属性。 5、网卡造成的影响 只要设置不当,网卡也会明显影响系统启动速度,你的电脑如果连接在局域网内,安装好网卡驱动程序后,默认情况下系统会自动通过DHCP来获得IP地址,但大多数公司的局域网并没有DHCP服务器,因此如果用户设置成“自动获得IP地址”,系统在启动时就会不断在网络中搜索DHCP 服务器,直到获得IP 地址或超时,自然就影响了启动时间,因此局域网用户最好为自己的电脑指定固定IP地址。 6、文件夹和打印机共享 安装了Windows XP专业版的电脑也会出现启动非常慢的时候,有些时候系统似乎给人死机的感觉,登录系统后,桌面也不出现,电脑就像停止反应,1分钟后才能正常使用。这是由于使用了Bootvis.exe 程序后,其中的Mrxsmb.dll文件为电脑启动添加了67秒的时间! 要解决这个问题,只要停止共享文件夹和打印机即可:选择“开始→设置→网络和拨号连接”,右击“本地连接”,选择“属性”,在打开的窗口中取消“此连接使用下列选定的组件”下的“ Microsoft 网络的文件和打印机共享”前的复选框,重启电脑即可。 7、系统配件配置不当 一些用户在组装机器时往往忽略一些小东西,从而造成计算机整体配件搭配不当,存在着速度上的瓶颈。比如有些朋友选的CPU档次很高,可声卡等却买了普通的便宜货,其实这样做往往是得不偿失。因为这样一来计算机在运行游戏、播放影碟时由于声卡占用CPU资源较高且其数据传输速度较慢,或者其根本无硬件解码而需要采用软件解码方式,常常会引起声音的停顿,甚至导致程序的运行断断续续。又如有些朋友的机器是升了级的,过去老机器上的一些部件如内存条舍不得抛弃,装在新机器上照用,可是由于老内存的速度限制,往往使新机器必须降低速度来迁就它,从而降低了整机的性能,极大地影响了整体的运行速度。 9、断开不用的网络驱动器 为了消除或减少 Windows 必须重新建立的网络连接数目,建议将一些不需要使用的网络驱动器断开,也就是进入“我的电脑”,右击已经建立映射的网络驱动器,选择“断开”即可。 10、缺少足够的内存 Windows操作系统所带来的优点之一就是多线性、多任务,系统可以利用CPU来进行分时操作,以便你同时做许多事情。但事情有利自然有弊,多任务操作也会对你的机器提出更高的要求。朋友们都知道即使是一个最常用的WORD软件也要求最好有16MB左右的内存,而运行如3D MAX等大型软件时,64MB的内存也不够用。所以此时系统就会自动采用硬盘空间来虚拟主内存,用于运行程序和储存交换文件以及各种临时文件。由于硬盘是机械结构,而内存是电子结构,它们两者之间的速度相差好几个数量级,因而使用硬盘来虚拟主内存将导致程序运行的速度大幅度降低。 11、硬盘空间不足 使用Windows系统平台的缺点之一就是对文件的管理不清楚,你有时根本就不知道这个文件对系统是否有用,因而Windows目录下的文件数目越来越多,容量也越来越庞大,加之现在的软件都喜欢越做越大,再加上一些系统产生的临时文件、交换文件,所有这些都会使得硬盘可用空间变小。当硬盘的可用空间小到一定程度时,就会造成系统的交换文件、临时文件缺乏可用空间,降低了系统的运行效率。更为重要的是由于我们平时频繁在硬盘上储存、删除各种软件,使得硬盘的可用空间变得支离破碎,因此系统在存储文件时常常没有按连续的顺序存放,这将导致系统存储和读取文件时频繁移动磁头,极大地降低了系统的运行速度。 12、硬盘分区太多也有错 如果你的Windows 2000没有升级到SP3或SP4,并且定义了太多的分区,那么也会使启动变得很漫长,甚至挂起。所以建议升级最新的SP4,同时最好不要为硬盘分太多的区。因为Windows 在启动时必须装载每个分区,随着分区数量的增多,完成此操作的时间总量也会不断增长。 三、病毒篇 如果你的计算机感染了病毒,那么系统的运行速度会大幅度变慢。病毒入侵后,首先占领内存这个据点,然后便以此为根据地在内存中开始漫无休止地复制自己,随着它越来越庞大,很快就占用了系统大量的内存,导致正常程序运行时因缺少主内存而变慢,甚至不能启动;同时病毒程序会迫使CPU转而执行无用的垃圾程序,使得系统始终处于忙碌状态,从而影响了正常程序的运行,导致计算机速度变慢。下面我们就介绍几种能使系统变慢的病毒。 1、使系统变慢的bride病毒 病毒类型:黑客程序 发作时间:随机 传播方式:网络 感染对象:网络 警惕程度:★★★★ 病毒介绍: 此病毒可以在Windows 2000、Windows XP等操作系统环境下正常运行。运行时会自动连接 www.hotmail.com网站,如果无法连接到此网站,则病毒会休眠几分钟,然后修改注册表将自己加入注册表自启动项,病毒会释放出四个病毒体和一个有漏洞的病毒邮件并通过邮件系统向外乱发邮件,病毒还会释放出FUNLOVE病毒感染局域网计算机,最后病毒还会杀掉已知的几十家反病毒软件,使这些反病毒软件失效。 病毒特征 如果用户发现计算机中有这些特征,则很有可能中了此病毒。 ·病毒运行后会自动连接 www.hotmail.com网站。 ·病毒会释放出Bride.exe,Msconfig.exe,Regedit.exe三个文件到系统目录;释放出:Help.eml, Explorer.exe文件到桌面。 ·病毒会在注册表的HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun项中加入病毒Regedit.exe的路径。 ·病毒运行时会释放出一个FUNLOVE病毒并将之执行,而FUNLOVE病毒会在计算机中大量繁殖,造成系统变慢,网络阻塞。 ·病毒会寻找计算机中的邮件地址,然后按照地址向外大量发送标题为:<被感染的计算机机名>(例:如果用户的计算机名为:张冬, 则病毒邮件的标题为:张冬)的病毒邮件。 ·病毒还会杀掉几十家国外著名的反病毒软件。 用户如果在自己的计算机中发现以上全部或部分现象,则很有可能中了Bride(Worm.bride)病毒,请用户立刻用手中的杀毒软件进行清除。 2、使系统变慢的阿芙伦病毒 病毒类型:蠕虫病毒 发作时间:随机 传播方式:网络/文件 感染对象:网络 警惕程度:★★★★ 病毒介绍: 此病毒可以在Windows 9X、Windows NT、Windows 2000、Windows XP等操作系统环境下正常运行。病毒运行时将自己复到到TEMP、SYSTEM、RECYCLED目录下,并随机生成文件名。该病毒运行后,会使消耗大量的系统资源,使系统明显变慢,并且杀掉一些正在运行的反病毒软件,建立四个线程在局域网中疯狂传播。 病毒特征 如果用户发现计算机中有这些特征,则很有可能中了此病毒: ·病毒运行时会将自己复到到TEMP、SYSTEM、RECYCLED目录下,文件名随机 ·病毒运行时会使系统明显变慢 ·病毒会杀掉一些正在运行的反病毒软件 ·病毒会修改注册表的自启动项进行自启动 ·病毒会建立四个线程在局域网中传播 用户如果在自己的计算机中发现以上全部或部分现象,则很有可能中了“阿芙伦(Worm.Avron)”病毒,由于此病毒没有固定的病毒文件名,所以,最好还是选用杀毒软件进行清除。 3、恶性蠕虫 震荡波 病毒名称: Worm.Sasser 中文名称: 震荡波 病毒别名: W32/Sasser.worm [Mcafee] 病毒类型: 蠕虫 受影响系统:WinNT/Win2000/WinXP/Win2003 病毒感染症状: ·莫名其妙地死机或重新启动计算机; ·系统速度极慢,cpu占用100%; ·网络变慢; ·最重要的是,任务管理器里有一个叫"avserve.exe"的进程在运行! 破坏方式: ·利用WINDOWS平台的 Lsass 漏洞进行广泛传播,开启上百个线程不停攻击其它网上其它系统,堵塞网络。病毒的攻击行为可让系统不停的倒计时重启。 ·和最近出现的大部分蠕虫病毒不同,该病毒并不通过邮件传播,而是通过命令易受感染的机器 下载特定文件并运行,来达到感染的目的。 ·文件名为:avserve.exe 解决方案: ·请升级您的操作系统,免受攻击 ·请打开个人防火墙屏蔽端口:445、5554和9996,防止名为avserve.exe的程序访问网络 ·手工解决方案: 首先,若系统为WinMe/WinXP,则请先关闭系统还原功能; 步骤一,使用进程程序管理器结束病毒进程 右键单击任务栏,弹出菜单,选择“任务管理器”,调出“Windows任务管理器”窗口。在任务管理器中,单击“进程”标签,在例表栏内找到病毒进程“avserve.exe”,单击“结束进程按钮”,点击“是”,结束病毒进程,然后关闭“Windows任务管理器”; 步骤二,查找并删除病毒程序 通过“我的电脑”或“资源管理器”进入 系统安装目录(Winnt或windows),找到文件“avser ve.exe”,将它删除;然后进入系统目录(Winntsystem32或windowssystem32),找 到文件"*_up.exe", 将它们删除; 步骤三,清除病毒在注册表里添加的项 打开注册表编辑器: 点击开始——>运行, 输入REGEDIT, 按Enter; 在左边的面板中, 双击(按箭头顺序查找,找到后双击): HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionRun 在右边的面板中, 找到并删除如下项目:"avserve.exe" = %SystemRoot%avserve.exe 关闭注册表编辑器。 第二部份 系统加速 一、Windows 98 1、不要加载太多随机启动程序 不要在开机时载入太多不必要的随机启动程序。选择“开始→程序→附件→系统工具→系统信息→系统信息对话框”,然后,选择“工具→系统配置实用程序→启动”,只需要internat.exe前打上钩,其他项都可以不需要,选中后确定重起即可。 2、转换系统文件格式 将硬盘由FAT16转为FAT32。 3、不要轻易使用背景 不要使用ActiveDesktop,否则系统运行速度会因此减慢(右击屏幕→寻显示器属性→Web标签→将其中关于“活动桌面”和“频道”的选项全部取消)。 4、设置虚拟内存 自己设定虚拟内存为机器内存的3倍,例如:有32M的内存就设虚拟内存为96M,且最大值和最小值都一样(此设定可通过“控制面板→系统→性能→虚拟内存”来设置)。 5、一些优化设置 a、到控制面板中,选择“系统→性能→ 文件系统”。将硬盘标签的“计算机主要用途”改为网络服务器,“预读式优化"调到全速。 b、将“软盘”标签中“每次启动就搜寻新的软驱”取消。 c、CD-ROM中的“追加高速缓存”调至最大,访问方式选四倍速或更快的CD-ROM。 6、定期对系统进行整理 定期使用下列工具:磁盘扫描、磁盘清理、碎片整理、系统文件检查器(ASD)、Dr?Watson等。 二、Windows 2000 1、升级文件系统 a、如果你所用的操作系统是win 9x与win 2000双重启动的话,建议文件系统格式都用FAT32格式,这样一来可以节省硬盘空间,二来也可以9x与2000之间能实行资源共享。 提醒:要实现这样的双重启动,最好是先在纯DOS环境下安装完9x在C区,再在9x中或者用win 2000启动盘启动在DOS环境下安装2000在另一个区内,并且此区起码要有800M的空间以上 b、如果阁下只使用win 2000的话,建议将文件系统格式转化为NTFS格式,这样一来可节省硬盘空间,二来稳定性和运转速度更高,并且此文件系统格式有很好的纠错性;但这样一来,DOS和win 9x系统就不能在这文件系统格式中运行,这也是上面所说做双启动最好要用FAT32格式才能保证资源共享的原因。而且,某些应用程序也不能在此文件系统格式中运行,大多是DOS下的游戏类。 提醒:在win 2000下将文件系统升级为NTFS格式的方法是,点击“开始-程序-附件”选中“命令提示符”,然后在打开的提示符窗口输入"convert drive_letter:/fs:ntfs",其中的"drive"是你所要升级的硬盘分区符号,如C区;还需要说明的是,升级文件系统,不会破坏所升级硬盘分区里的文件,无需要备份。 · 再运行“添加-删除程序”,就会看见多出了个“添加/删除 Windows 组件”的选项; b、打开“文件夹选项”,在“查看”标签里选中“显示所有文件和文件夹”,此时在你安装win 2000下的区盘根目录下会出现Autoexec.bat和Config.sys两个文件,事实上这两个文件里面根本没有任何内容,可以将它们安全删除。 c、右击“我的电脑”,选中“管理”,在点“服务和应用程序”下的“服务”选项,会看见win 2000上加载的各个程序组见,其中有许多是关于局域网设置或其它一些功能的,你完全可以将你不使用的程序禁用; 如:Alertr,如果你不是处于局域网中,完全可以它设置为禁用;还有Fax Service,不发传真的设置成禁用;Print Spooler,没有打印机的设置成制用;Uninterruptible power Supply,没有UPS的也设置成禁用,这些加载程序你自己可以根据自己实际情况进行设置。 各个加载程序后面都有说明,以及运行状态;选中了要禁用的程序,右击它,选“属性”,然后单击停止,并将“启动类型”设置为“手动”或者“已禁用”就行了 d、关掉调试器Dr. Watson; 运行drwtsn32,把除了“转储全部线程上下文”之外的全都去掉。否则一旦有程序出错,硬盘会响很久,而且会占用很多空间。如果你以前遇到过这种情况,请查找user.dmp文件并删掉,可能会省掉几十兆的空间。这是出错程序的现场,对我们没用。另外蓝屏时出现的memory.dmp也可删掉。可在我的电脑/属性中关掉 “答案来源于网络,供您参考” 希望以上信息可以帮到您!

牧明 2019-12-02 02:15:52 0 浏览量 回答数 0

问题

SSH面试题

琴瑟 2019-12-01 21:46:22 3489 浏览量 回答数 0

问题

大数据时代——数据存储技术百问

yq传送门 2019-12-01 20:27:42 31965 浏览量 回答数 35

回答

92题 一般来说,建立INDEX有以下益处:提高查询效率;建立唯一索引以保证数据的唯一性;设计INDEX避免排序。 缺点,INDEX的维护有以下开销:叶节点的‘分裂’消耗;INSERT、DELETE和UPDATE操作在INDEX上的维护开销;有存储要求;其他日常维护的消耗:对恢复的影响,重组的影响。 需要建立索引的情况:为了建立分区数据库的PATITION INDEX必须建立; 为了保证数据约束性需要而建立的INDEX必须建立; 为了提高查询效率,则考虑建立(是否建立要考虑相关性能及维护开销); 考虑在使用UNION,DISTINCT,GROUP BY,ORDER BY等字句的列上加索引。 91题 作用:加快查询速度。原则:(1) 如果某属性或属性组经常出现在查询条件中,考虑为该属性或属性组建立索引;(2) 如果某个属性常作为最大值和最小值等聚集函数的参数,考虑为该属性建立索引;(3) 如果某属性经常出现在连接操作的连接条件中,考虑为该属性或属性组建立索引。 90题 快照Snapshot是一个文件系统在特定时间里的镜像,对于在线实时数据备份非常有用。快照对于拥有不能停止的应用或具有常打开文件的文件系统的备份非常重要。对于只能提供一个非常短的备份时间而言,快照能保证系统的完整性。 89题 游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。 88题 事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。 87题 MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。具体原因为:MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。 86题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 85题 存储过程是一组Transact-SQL语句,在一次编译后可以执行多次。因为不必重新编译Transact-SQL语句,所以执行存储过程可以提高性能。触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 84题 存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。 83题 减少表连接,减少复杂 SQL,拆分成简单SQL。减少排序:非必要不排序,利用索引排序,减少参与排序的记录数。尽量避免 select *。尽量用 join 代替子查询。尽量少使用 or,使用 in 或者 union(union all) 代替。尽量用 union all 代替 union。尽量早的将无用数据过滤:选择更优的索引,先分页再Join…。避免类型转换:索引失效。优先优化高并发的 SQL,而不是执行频率低某些“大”SQL。从全局出发优化,而不是片面调整。尽可能对每一条SQL进行 explain。 82题 如果条件中有or,即使其中有条件带索引也不会使用(要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引)。对于多列索引,不是使用的第一部分,则不会使用索引。like查询是以%开头。如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。如果mysql估计使用全表扫描要比使用索引快,则不使用索引。例如,使用<>、not in 、not exist,对于这三种情况大多数情况下认为结果集很大,MySQL就有可能不使用索引。 81题 主键不能重复,不能为空,唯一键不能重复,可以为空。建立主键的目的是让外键来引用。一个表最多只有一个主键,但可以有很多唯一键。 80题 空值('')是不占用空间的,判断空字符用=''或者<>''来进行处理。NULL值是未知的,且占用空间,不走索引;判断 NULL 用 IS NULL 或者 is not null ,SQL 语句函数中可以使用 ifnull ()函数来进行处理。无法比较 NULL 和 0;它们是不等价的。无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。NULL 值可以使用 <=> 符号进行比较,该符号与等号作用相似,但对NULL有意义。进行 count ()统计某列的记录数的时候,如果采用的 NULL 值,会被系统自动忽略掉,但是空值是统计到其中。 79题 HEAP表是访问数据速度最快的MySQL表,他使用保存在内存中的散列索引。一旦服务器重启,所有heap表数据丢失。BLOB或TEXT字段是不允许的。只能使用比较运算符=,<,>,=>,= <。HEAP表不支持AUTO_INCREMENT。索引不可为NULL。 78题 如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者只用(Ox)前缀输入十六进制数字。如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。 77题 Mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。 76题 在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。 75题 它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。 74题 创建索引的时候尽量使用唯一性大的列来创建索引,由于使用b+tree做为索引,以innodb为例,一个树节点的大小由“innodb_page_size”,为了减少树的高度,同时让一个节点能存放更多的值,索引列尽量在整数类型上创建,如果必须使用字符类型,也应该使用长度较少的字符类型。 73题 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下: 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读。垂直分区: 根据数据库里面数据表的相关性进行拆分。简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。水平分区: 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。 72题 乐观锁失败后会抛出ObjectOptimisticLockingFailureException,那么我们就针对这块考虑一下重试,自定义一个注解,用于做切面。针对注解进行切面,设置最大重试次数n,然后超过n次后就不再重试。 71题 一致性非锁定读讲的是一条记录被加了X锁其他事务仍然可以读而不被阻塞,是通过innodb的行多版本实现的,行多版本并不是实际存储多个版本记录而是通过undo实现(undo日志用来记录数据修改前的版本,回滚时会用到,用来保证事务的原子性)。一致性锁定读讲的是我可以通过SELECT语句显式地给一条记录加X锁从而保证特定应用场景下的数据一致性。 70题 数据库引擎:尤其是mysql数据库只有是InnoDB引擎的时候事物才能生效。 show engines 查看数据库默认引擎;SHOW TABLE STATUS from 数据库名字 where Name='表名' 如下;SHOW TABLE STATUS from rrz where Name='rrz_cust';修改表的引擎alter table table_name engine=innodb。 69题 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);哈希索引也不支持多列联合索引的最左匹配规则;B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。 68题 decimal精度比float高,数据处理比float简单,一般优先考虑,但float存储的数据范围大,所以范围大的数据就只能用它了,但要注意一些处理细节,因为不精确可能会与自己想的不一致,也常有关于float 出错的问题。 67题 datetime、timestamp精确度都是秒,datetime与时区无关,存储的范围广(1001-9999),timestamp与时区有关,存储的范围小(1970-2038)。 66题 Char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。Varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储。char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较。Varbinary保存变长的字符串,后面不会补\0。 65题 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。 64题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 63题 存储过程是一些预编译的SQL语句。1、更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。2、存储过程是一个预编译的代码块,执行效率比较高,一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全。 62题 密码散列、盐、用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率。 61题 推荐使用自增ID,不要使用UUID。因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。总之,在数据量大一些的情况下,用自增主键性能会好一些。 60题 char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容。该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间。在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar。例如存储用户MD5加密后的密码,则应该使用char。 59题 一. read uncommitted(读取未提交数据) 即便是事务没有commit,但是我们仍然能读到未提交的数据,这是所有隔离级别中最低的一种。 二. read committed(可以读取其他事务提交的数据)---大多数数据库默认的隔离级别 当前会话只能读取到其他事务提交的数据,未提交的数据读不到。 三. repeatable read(可重读)---MySQL默认的隔离级别 当前会话可以重复读,就是每次读取的结果集都相同,而不管其他事务有没有提交。 四. serializable(串行化) 其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格的,但是这样做势必对性能造成影响。所以在实际的选用上,我们要根据当前具体的情况选用合适的。 58题 B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了。范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于3的数据,当在叶子节点中查到3时,通过3的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到3的父节点。 57题 因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。 56题 redo log是物理日志,记录的是"在某个数据页上做了什么修改"。 binlog是逻辑日志,记录的是这个语句的原始逻辑,比如"给ID=2这一行的c字段加1"。 redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。 redo log是循环写的,空间固定会用完:binlog 是可以追加写入的。"追加写"是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。 最开始 MySQL 里并没有 InnoDB 引擎,MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog日志只能用于归档。而InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统,也就是 redo log 来实现 crash-safe 能力。 55题 重做日志(redo log)      作用:确保事务的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性。 回滚日志(undo log)  作用:保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。 二进 制日志(binlog)    作用:用于主从复制,实现主从同步;用于数据库的基于时间点的还原。 错误日志(errorlog) 作用:Mysql本身启动,停止,运行期间发生的错误信息。 慢查询日志(slow query log)  作用:记录执行时间过长的sql,时间阈值可以配置,只记录执行成功。 一般查询日志(general log)    作用:记录数据库的操作明细,默认关闭,开启后会降低数据库性能 。 中继日志(relay log) 作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放。 54题 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 死锁: 是指两个或两个以上的进程在执行过程中。因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。 那么对应的解决死锁问题的关键就是:让不同的session加锁有次序。死锁的解决办法:1.查出的线程杀死。2.设置锁的超时时间。3.指定获取锁的顺序。 53题 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性(脏读,不可重复读,幻读等),可能产生死锁。 乐观锁:乐观锁不是数据库自带的,需要我们自己去实现。 悲观锁:在进行每次操作时都要通过获取锁才能进行对相同数据的操作。 共享锁:加了共享锁的数据对象可以被其他事务读取,但不能修改。 排他锁:当数据对象被加上排它锁时,一个事务必须得到锁才能对该数据对象进行访问,一直到事务结束锁才被释放。 行锁:就是给某一条记录加上锁。 52题 Mysql是关系型数据库,MongoDB是非关系型数据库,数据存储结构的不同。 51题 关系型数据库优点:1.保持数据的一致性(事务处理)。 2.由于以标准化为前提,数据更新的开销很小。 3. 可以进行Join等复杂查询。 缺点:1、为了维护一致性所付出的巨大代价就是其读写性能比较差。 2、固定的表结构。 3、高并发读写需求。 4、海量数据的高效率读写。 非关系型数据库优点:1、无需经过sql层的解析,读写性能很高。 2、基于键值对,数据没有耦合性,容易扩展。 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 缺点:1、不提供sql支持,学习和使用成本较高。 2、无事务处理,附加功能bi和报表等支持也不好。 redis与mongoDB的区别: 性能:TPS方面redis要大于mongodb。 可操作性:mongodb支持丰富的数据表达,索引,redis较少的网络IO次数。 可用性:MongoDB优于Redis。 一致性:redis事务支持比较弱,mongoDB不支持事务。 数据分析:mongoDB内置了数据分析的功能(mapreduce)。 应用场景:redis数据量较小的更性能操作和运算上,MongoDB主要解决海量数据的访问效率问题。 50题 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。 49题 分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。 48题 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6种策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: 1.定时去清理过期的缓存; 2.当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,可以根据应用场景来权衡。 47题 Redis提供了两种方式来作消息队列: 一个是使用生产者消费模式模式:会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听 。另一个就是发布订阅者模式:也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是平等的。 46题 Redis的数据结构列表(list)可以实现延时队列,可以通过队列和栈来实现。blpop/brpop来替换lpop/rpop,blpop/brpop阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。Redis的有序集合(zset)可以用于实现延时队列,消息作为value,时间作为score。Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。 45题 1.热点数据缓存:因为Redis 访问速度块、支持的数据类型比较丰富。 2.限时业务:expire 命令设置 key 的生存时间,到时间后自动删除 key。 3.计数器:incrby 命令可以实现原子性的递增。 4.排行榜:借助 SortedSet 进行热点数据的排序。 5.分布式锁:利用 Redis 的 setnx 命令进行。 6.队列机制:有 list push 和 list pop 这样的命令。 44题 一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。 43题 RDB的优点:适合做冷备份;读写服务影响小,reids可以保持高性能;重启和恢复redis进程,更加快速。RDB的缺点:宕机会丢失最近5分钟的数据;文件特别大时可能会暂停数毫秒,或者甚至数秒。 AOF的优点:每个一秒执行fsync操作,最多丢失1秒钟的数据;以append-only模式写入,没有任何磁盘寻址的开销;文件过大时,不会影响客户端读写;适合做灾难性的误删除的紧急恢复。AOF的缺点:AOF日志文件比RDB数据快照文件更大,支持写QPS比RDB支持的写QPS低;比RDB脆弱,容易有bug。 42题 对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。而在程序中执行多个Redis命令并非是原子性的,这也和普通数据库的表现是一样的,可以用incr或者使用Redis的事务,或者使用Redis+Lua的方式实现。对Redis来说,执行get、set以及eval等API,都是一个一个的任务,这些任务都会由Redis的线程去负责执行,任务要么执行成功,要么执行失败,这就是Redis的命令是原子性的原因。 41题 (1)twemproxy,使用方式简单(相对redis只需修改连接端口),对旧项目扩展的首选。(2)codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数改变情况下,旧节点数据可恢复到新hash节点。(3)redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。(4)在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的代替算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。 40题 (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 (4) 尽量避免在压力很大的主库上增加从库 (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。 39题 比如订单管理,热数据:3个月内的订单数据,查询实时性较高;温数据:3个月 ~ 12个月前的订单数据,查询频率不高;冷数据:1年前的订单数据,几乎不会查询,只有偶尔的查询需求。热数据使用mysql进行存储,需要分库分表;温数据可以存储在ES中,利用搜索引擎的特性基本上也可以做到比较快的查询;冷数据可以存放到Hive中。从存储形式来说,一般情况冷数据存储在磁带、光盘,热数据一般存放在SSD中,存取速度快,而温数据可以存放在7200转的硬盘。 38题 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。 37题 分层架构设计,有一条准则:站点层、服务层要做到无数据无状态,这样才能任意的加节点水平扩展,数据和状态尽量存储到后端的数据存储服务,例如数据库服务或者缓存服务。显然进程内缓存违背了这一原则。 36题 更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。 35题 redis分布式锁加锁过程:通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功;redis分布式锁解锁过程:匹配随机值,删除redis上的特点key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的,为保证原子性一般使用lua脚本实现;在此基础上进一步优化的话,考虑使用心跳检测对锁的有效期进行续期,同时基于redis的发布订阅优雅的实现阻塞式加锁。 34题 volatile-lru:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。 volatile-ttl:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选将要过期的数据淘汰。 volatile-random:当内存不足以容纳写入数据时,从已设置过期时间的数据集中任意选择数据淘汰。 allkeys-lru:当内存不足以容纳写入数据时,从数据集中挑选最近最少使用的数据淘汰。 allkeys-random:当内存不足以容纳写入数据时,从数据集中任意选择数据淘汰。 noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错。 33题 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 32题 缓存击穿,一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。如何避免:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。 31题 缓存雪崩,是指在某一个时间段,缓存集中过期失效。大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。而缓存服务器某个节点宕机或断网,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。如何避免:1.redis高可用,搭建redis集群。2.限流降级,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。3.数据预热,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间。 30题 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。一些恶意的请求会故意查询不存在的 key,请求量很大,对数据库造成压力,甚至压垮数据库。 如何避免:1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清理缓存。2:对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 bitmap 过滤。 29题 1.memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型。 2.redis 的速度比 memcached 快很多。 3.redis 可以持久化其数据。 4.Redis支持数据的备份,即master-slave模式的数据备份。 5.Redis采用VM机制。 6.value大小:redis最大可以达到1GB,而memcache只有1MB。 28题 Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过spring提供的@ImportResource来加载xml配置。例如:@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"}) 27题 Spring像一个大家族,有众多衍生产品例如Spring Boot,Spring Security等等,但他们的基础都是Spring的IOC和AOP,IOC提供了依赖注入的容器,而AOP解决了面向切面的编程,然后在此两者的基础上实现了其他衍生产品的高级功能。Spring MVC是基于Servlet的一个MVC框架,主要解决WEB开发的问题,因为 Spring的配置非常复杂,各种xml,properties处理起来比较繁琐。Spring Boot遵循约定优于配置,极大降低了Spring使用门槛,又有着Spring原本灵活强大的功能。总结:Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个MVC框架,而Spring Boot是基于Spring的一套快速开发整合包。 26题 YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。YAML 的配置文件后缀为 .yml,是一种人类可读的数据序列化语言,可以简单表达清单、散列表,标量等数据形态。它通常用于配置文件,与属性文件相比,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。 25题 Spring Boot有3种热部署方式: 1.使用springloaded配置pom.xml文件,使用mvn spring-boot:run启动。 2.使用springloaded本地加载启动,配置jvm参数-javaagent:<jar包地址> -noverify。 3.使用devtools工具包,操作简单,但是每次需要重新部署。 用

游客ih62co2qqq5ww 2020-03-27 23:56:48 0 浏览量 回答数 0

问题

【精品问答】python技术1000问(1)

问问小秘 2019-12-01 21:57:48 454222 浏览量 回答数 19

回答

共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE 锁的类别有两种分法: 1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 MS-SQL Server 使用以下资源锁模式。 锁模式 描述 共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。 共享锁 共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。 更新锁 更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。 若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。 排它锁 排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。 意向锁 意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。 意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 锁模式 描述 意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。 意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。 与意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。 独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。 共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行Select时,SQL Server会对对象加共享锁。 更新锁:当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 1.表级锁定(table-level) 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。 使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 2.行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。 虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。 使用行级锁定的主要是InnoDB存储引擎。 3.页级锁定(page-level) 页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。 在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。 使用页级锁定的主要是BerkeleyDB存储引擎。 总的来说,MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低; 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高; 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。 -------------MYSQL处理------------------ 表级锁定 由于MyISAM存储引擎使用的锁定机制完全是由MySQL提供的表级锁定实现,所以下面我们将以MyISAM存储引擎作为示例存储引擎。 1.MySQL表级锁的锁模式 MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。锁模式的兼容性: 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求; 对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作; MyISAM表的读操作与写操作之间,以及写操作之间是串行的。当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。 2.如何加表锁 MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。 3.MyISAM表锁优化建议 对于MyISAM存储引擎,虽然使用表级锁定在锁定实现的过程中比实现行级锁定或者页级锁所带来的附加成本都要小,锁定本身所消耗的资源也是最少。但是由于锁定的颗粒度比较到,所以造成锁定资源的争用情况也会比其他的锁定级别都要多,从而在较大程度上会降低并发处理能力。所以,在优化MyISAM存储引擎锁定问题的时候,最关键的就是如何让其提高并发度。由于锁定级别是不可能改变的了,所以我们首先需要尽可能让锁定的时间变短,然后就是让可能并发进行的操作尽可能的并发。 (1)查询表级锁争用情况 MySQL内部有两组专门的状态变量记录系统内部锁资源争用情况: mysql> show status like 'table%'; +----------------------------+---------+ | Variable_name | Value | +----------------------------+---------+ | Table_locks_immediate | 100 | | Table_locks_waited | 10 | +----------------------------+---------+ 这里有两个状态变量记录MySQL内部表级锁定的情况,两个变量说明如下: Table_locks_immediate:产生表级锁定的次数; Table_locks_waited:出现表级锁定争用而发生等待的次数; 两个状态值都是从系统启动后开始记录,出现一次对应的事件则数量加1。如果这里的Table_locks_waited状态值比较高,那么说明系统中表级锁定争用现象比较严重,就需要进一步分析为什么会有较多的锁定资源争用了。 (2)缩短锁定时间 如何让锁定时间尽可能的短呢?唯一的办法就是让我们的Query执行时间尽可能的短。 a)尽两减少大的复杂Query,将复杂Query分拆成几个小的Query分布进行; b)尽可能的建立足够高效的索引,让数据检索更迅速; c)尽量让MyISAM存储引擎的表只存放必要的信息,控制字段类型; d)利用合适的机会优化MyISAM表数据文件。 (3)分离能并行的操作 说到MyISAM的表锁,而且是读写互相阻塞的表锁,可能有些人会认为在MyISAM存储引擎的表上就只能是完全的串行化,没办法再并行了。大家不要忘记了,MyISAM的存储引擎还有一个非常有用的特性,那就是ConcurrentInsert(并发插入)的特性。 MyISAM存储引擎有一个控制是否打开Concurrent Insert功能的参数选项:concurrent_insert,可以设置为0,1或者2。三个值的具体说明如下: concurrent_insert=2,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录; concurrent_insert=1,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置; concurrent_insert=0,不允许并发插入。 可以利用MyISAM存储引擎的并发插入特性,来解决应用中对同一表查询和插入的锁争用。例如,将concurrent_insert系统变量设为2,总是允许并发插入;同时,通过定期在系统空闲时段执行OPTIMIZE TABLE语句来整理空间碎片,收回因删除记录而产生的中间空洞。 (4)合理利用读写优先级 MyISAM存储引擎的是读写互相阻塞的,那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢? 答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前。 这是因为MySQL的表级锁定对于读和写是有不同优先级设定的,默认情况下是写优先级要大于读优先级。 所以,如果我们可以根据各自系统环境的差异决定读与写的优先级: 通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接读比写的优先级高。如果我们的系统是一个以读为主,可以设置此参数,如果以写为主,则不用设置; 通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。 虽然上面方法都是要么更新优先,要么查询优先的方法,但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。 另外,MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。 这里还要强调一点:一些需要长时间运行的查询操作,也会使写进程“饿死”,因此,应用中应尽量避免出现长时间运行的查询操作,不要总想用一条SELECT语句来解决问题,因为这种看似巧妙的SQL语句,往往比较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对SQL语句做一定的“分解”,使每一步查询都能在较短时间完成,从而减少锁冲突。如果复杂查询不可避免,应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行 三、行级锁定 行级锁定不是MySQL自己实现的锁定方式,而是由其他存储引擎自己所实现的,如广为大家所知的InnoDB存储引擎,以及MySQL的分布式存储引擎NDBCluster等都是实现了行级锁定。考虑到行级锁定君由各个存储引擎自行实现,而且具体实现也各有差别,而InnoDB是目前事务型存储引擎中使用最为广泛的存储引擎,所以这里我们就主要分析一下InnoDB的锁定特性。 1.InnoDB锁定模式及实现机制 考虑到行级锁定君由各个存储引擎自行实现,而且具体实现也各有差别,而InnoDB是目前事务型存储引擎中使用最为广泛的存储引擎,所以这里我们就主要分析一下InnoDB的锁定特性。 总的来说,InnoDB的锁定机制和Oracle数据库有不少相似之处。InnoDB的行级锁定同样分为两种类型,共享锁和排他锁,而在锁定机制的实现过程中为了让行级锁定和表级锁定共存,InnoDB也同样使用了意向锁(表级锁定)的概念,也就有了意向共享锁和意向排他锁这两种。 当一个事务需要给自己需要的某个资源加锁的时候,如果遇到一个共享锁正锁定着自己需要的资源的时候,自己可以再加一个共享锁,不过不能加排他锁。但是,如果遇到自己需要锁定的资源已经被一个排他锁占有之后,则只能等待该锁定释放资源之后自己才能获取锁定资源并添加自己的锁定。而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。所以,可以说InnoDB的锁定模式实际上可以分为四种:共享锁(S),排他锁(X),意向共享锁(IS)和意向排他锁(IX),我们可以通过以下表格来总结上面这四种所的共存逻辑关系 如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。 意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。 共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE 用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。 但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT... FOR UPDATE方式获得排他锁。 2.InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。下面通过一些实际例子来加以说明。 (1)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁。 (2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。 (3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。 (4)即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。 3.间隙锁(Next-Key锁) 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁; 对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。 例: 假如emp表中只有101条记录,其empid的值分别是 1,2,...,100,101,下面的SQL: mysql> select * from emp where empid > 100 for update; 是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁。 InnoDB使用间隙锁的目的: (1)防止幻读,以满足相关隔离级别的要求。对于上面的例子,要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读; (2)为了满足其恢复和复制的需要。 很显然,在使用范围条件检索并锁定记录时,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害。 除了间隙锁给InnoDB带来性能的负面影响之外,通过索引实现锁定的方式还存在其他几个较大的性能隐患: (1)当Query无法利用索引的时候,InnoDB会放弃使用行级别锁定而改用表级别的锁定,造成并发性能的降低; (2)当Query使用的索引并不包含所有过滤条件的时候,数据检索使用到的索引键所只想的数据可能有部分并不属于该Query的结果集的行列,但是也会被锁定,因为间隙锁锁定的是一个范围,而不是具体的索引键; (3)当Query在使用索引定位数据的时候,如果使用的索引键一样但访问的数据行不同的时候(索引只是过滤条件的一部分),一样会被锁定。 因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。 还要特别说明的是,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁。 4.死锁 MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,当两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁。 在InnoDB的事务管理和锁定机制中,有专门检测死锁的机制,会在系统中产生死锁之后的很短时间内就检测到该死锁的存在。当InnoDB检测到系统中产生了死锁之后,InnoDB会通过相应的判断来选这产生死锁的两个事务中较小的事务来回滚,而让另外一个较大的事务成功完成。 那InnoDB是以什么来为标准判定事务的大小的呢?MySQL官方手册中也提到了这个问题,实际上在InnoDB发现死锁之后,会计算出两个事务各自插入、更新或者删除的数据量来判定两个事务的大小。也就是说哪个事务所改变的记录条数越多,在死锁中就越不会被回滚掉。 但是有一点需要注意的就是,当产生死锁的场景中涉及到不止InnoDB存储引擎的时候,InnoDB是没办法检测到该死锁的,这时候就只能通过锁定超时限制参数InnoDB_lock_wait_timeout来解决。 需要说明的是,这个参数并不是只用来解决死锁问题,在并发访问比较高的情况下,如果大量事务因无法立即获得所需的锁而挂起,会占用大量计算机资源,造成严重性能问题,甚至拖跨数据库。我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。 通常来说,死锁都是应用设计的问题,通过调整业务流程、数据库对象设计、事务大小,以及访问数据库的SQL语句,绝大部分死锁都可以避免。下面就通过实例来介绍几种避免死锁的常用方法: (1)在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会。 (2)在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能。 (3)在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁,更新时再申请排他锁,因为当用户申请排他锁时,其他事务可能又已经获得了相同记录的共享锁,从而造成锁冲突,甚至死锁。 (4)在REPEATABLE-READ隔离级别下,如果两个线程同时对相同条件记录用SELECT...FOR UPDATE加排他锁,在没有符合该条件记录情况下,两个线程都会加锁成功。程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做,就会出现死锁。这种情况下,将隔离级别改成READ COMMITTED,就可避免问题。 (5)当隔离级别为READ COMMITTED时,如果两个线程都先执行SELECT...FOR UPDATE,判断是否存在符合条件的记录,如果没有,就插入记录。此时,只有一个线程能插入成功,另一个线程会出现锁等待,当第1个线程提交后,第2个线程会因主键重出错,但虽然这个线程出错了,却会获得一个排他锁。这时如果有第3个线程又来申请排他锁,也会出现死锁。对于这种情况,可以直接做插入操作,然后再捕获主键重异常,或者在遇到主键重错误时,总是执行ROLLBACK释放获得的排他锁。 5.什么时候使用表锁 对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个别特殊事务中,也可以考虑使用表级锁: (1)事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。 (2)事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销。 应用中这两种事务不能太多,否则,就应该考虑使用MyISAM表了。 在InnoDB下,使用表锁要注意以下两点。 (1)使用LOCK TABLES虽然可以给InnoDB加表级锁,但必须说明的是,表锁不是由InnoDB存储引擎层管理的,而是由其上一层──MySQL Server负责的,仅当autocommit=0、InnoDB_table_locks=1(默认设置)时,InnoDB层才能知道MySQL加的表锁,MySQL Server也才能感知InnoDB加的行锁,这种情况下,InnoDB才能自动识别涉及表级锁的死锁,否则,InnoDB将无法自动检测并处理这种死锁。 (2)在用 LOCK TABLES对InnoDB表加锁时要注意,要将AUTOCOMMIT设为0,否则MySQL不会给表加锁;事务结束前,不要用UNLOCK TABLES释放表锁,因为UNLOCK TABLES会隐含地提交事务;COMMIT或ROLLBACK并不能释放用LOCK TABLES加的表级锁,必须用UNLOCK TABLES释放表锁。

1006541099824509 2019-12-02 03:14:39 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站