数据库
文章平均质量分 91
馒头2870
这个作者很懒,什么都没留下…
展开
-
【leveldb】从EncodeFixed64来看汇编层面的性能优化
前言 最近在读leveldb的代码,看到了EncodeFixed64的写法感觉很不解,为什么要写的这么繁琐晦涩,把整数存在一个char数组中不是一句sprintf就解决了吗?深挖之后,还真不是这么简单从git提交记录查起 从github上看关于这个函数最近的一个提交,Remove leveldb::port::kLittleEndian。 提交内容中写道:Clang 10包含了以下描述的优化https://bugs.llvm.org/show_bug.cgi?id=41761。 这意味着 {D原创 2021-01-16 16:39:07 · 499 阅读 · 1 评论 -
17.2.1.1 基于语句和基于行的复制的优势和劣势
每个binary log记录格式都有优势和劣势。对于大多数用户,混合复制格式会提供数据完整性和性能的最佳结合。但是,如果要在执行某些任务时利用特定于基于语句的复制格式或基于行的复制格式的功能,则可以使用本节中的信息,该信息概述了它们的相对优缺点, 确定最适合您的需求。 基于语句复制的优势 基于语句复制的劣势 基于行复制的优势 基于行复制的劣势基于语句复制的优势 成熟的技术。 向日志文件写入最少的数据。当更新或删除影响许多行时,这将导致日志文件所需的存储空间大大减少。 这也意味着从备翻译 2020-11-25 21:29:11 · 172 阅读 · 0 评论 -
17.2.1 复制格式
17.2.1.1 基于语句和基于行复制的优势和劣势17.2.1.2 基于行记录和复制的用处17.2.1.3 确定二进制日志中安全和不安全的语句复制之所以有效,是因为从源读取了写入二进制日志的事件,然后在副本上对其进行了处理。根据事件的类型,binary log中事件是以不同格式来记录的。当事件被记录到源的binary log中时,对应不同的bianry log记录格式,会用不同的复制格式。二进制日志记录格式与复制期间使用的术语之间的相关性是: 当使用基于语句的binary log记录时,源会写sq翻译 2020-11-25 21:28:26 · 119 阅读 · 0 评论 -
17.2节 复制的实现
17.2.1 复制格式17.2.2 复制通道17.2.3 复制线程17.2.4 relay log和复制元数据仓库17.5.2 服务器如何评估复制过滤规则复制是基于源服务器跟踪binary log中数据库的所有变化。binary log服务器用作从服务器启动以来修改数据库结构或内容(数据)的所有事件的书面记录。典型地,select 语句并不会被记录因为它们没有修改数据库结构或者内容。每个连接到源的副本会请求binary log的一份拷贝。也就是说,它从源拉数据,而不是源推数据到副本。副本也会执行翻译 2020-11-25 21:26:47 · 108 阅读 · 0 评论 -
第17.1.2节 设置基于binary log文件位置的复制
17.1.2.1设置复制源配置17.1.2.2设置副本配置17.1.2.3创建用于复制的用户17.1.2.4获取复制源二进制日志坐标17.1.2.5选择数据快照的方法17.1.2.6设置副本17.1.2.7在副本服务器上设置源配置17.1.2.8将副本添加到复制环境这节讨论了如何设置mysql服务器以使用基于binary log文件位置的复制。有很多不同的方法来设置复制,具体的方法取决于你怎样设置复制和你想要复制的源的数据库是否有数据。所有设置都有一些通用的任务: 在源上,你必须保证启翻译 2020-11-25 21:25:03 · 65 阅读 · 0 评论 -
第17.1.2.8节 添加副本到复制环境
你可以添加其他的副本到一个已存在的复制配置中,而不用停止源服务器。为了做到这个,你可以通过已存在副本的数据目录和给新的副本一个不同的服务器ID(用户指定),和服务器UUID(启动时生成)来设置新的副本。为了复制一个已存在的副本:停止已存在的副本并且记录副本状态信息,尤其时源的binary log文件和relay log文件位置。您可以在Performance Schema复制表(请参见第26.12.11节“ Performance Schema Replication Tables”)中查看副本状态翻译 2020-11-24 21:37:37 · 101 阅读 · 0 评论 -
第17.1.2.6节 设置副本
以下各节介绍如何设置副本。 在继续之前,请确保您具有: 使用必需的配置属性配置了源。 请参见第17.1.2.1节“设置复制源配置”。 获取源状态信息,或在关闭数据快照时生成的源二进制日志索引文件的副本。 请参见第17.1.2.4节“获取复制源二进制日志坐标”。 在源上,释放读锁: 在副本上,编辑mysql配置。参见17.1.2.2节,设置副本配置接下来的步骤取决于你是否有已存在的数据导入副本。参见17.1.2.5节,”为数据快照选择一个方法”的更多信息。选择下列之一: 如果没有要导入翻译 2020-11-24 21:36:16 · 154 阅读 · 0 评论 -
第17.1.2.5节 为数据快照选择一个方法
如果源服务器包含已存在的数据,那么有必要把这些数据拷贝到每个从服务器。有多种方法可以从源数据库中转储数据。 以下各节介绍了可能的选项。要选择转储数据库的适当方法,请在以下选项之间进行选择: 使用mysqld工具来创建你想要复制的所有数据库的转储。这是推荐的方法,尤其使用InnoDB时 如果你的数据库存储在二进制可移植文件中,你可以拷贝文件到副本。这比使用Mysqldump更高效并且在每个副本上导入了文件,因为它会在重放INSERT语句时跳过更新索引的开销。这种方法不建议使用InnoDB等存储引擎。翻译 2020-11-24 21:34:28 · 82 阅读 · 0 评论 -
第17.1.2.4节 获得复制源的binary log坐标
为了配置副本在正确的点启动复制进程,你需要注意源服务器binary log的当前坐标。Warning该过程使用带读取锁的FLUSH TABLES,这回阻塞InnoDB表的COMMIT操作。如果你正准备停止源服务器来创建数据快照,您可以可选地跳过此过程,而将二进制日志索引文件的副本与数据快照一起存储。在那种情景下,源会在重新启动时创建一个新的二进制日志文件。副本开始复制进程时源的binary log坐标当然也就是新文件的开始,该新文件是源上的下一个二进制日志文件,位于复制的二进制日志索引文件中列出的文件翻译 2020-11-24 21:32:34 · 72 阅读 · 0 评论 -
第17.1.2.3节 为复制创建用户
每个副本都使用一个mysql用户和密码来连接到源,所以在源上必须有一个用户账号使得副本可以连接。用户名是在你设置副本时的CHANGE MASTER TO命令的MASTER_USER选项指定的。只要已被授予REPLICATION SLAVE权限,任何账号都可以用于这个操作。你可以选择为每个副本创建不同的账号,或者每个副本使用相同的账号来连接到源。虽然你不用特意为复制创建一个账号,但你应当注意到,复制用户名和密码是以纯文本存储在副本的连接元数据库mysql.slave_master_info中(参见17.2.翻译 2020-11-24 21:31:51 · 119 阅读 · 0 评论 -
第17.1.2.2节 副本配置的设置
每个副本必须有一个独一无二的服务器ID,被server_id系统变量指定。如果你正在设置多个副本,每个都必须有一个独一无二的不同于源和其他副本的server_id。如果副本的服务器ID值还没有设置,或者当前的server_id与源或者其他副本服务器的值所冲突,你必须改变这个server_id。默认的server_id值是1。你可以使用下面的语句动态地来改变server_id的值:请注意,服务器ID为0会阻止副本连接到源。如果先前设置了服务器ID值(这是早期版本中的默认值),则必须重新启动服务器以使用新翻译 2020-11-24 21:31:03 · 147 阅读 · 0 评论 -
第17.1.2.1节 设置复制源的配置
为配置源来启用基于binary log文件位置的复制,你必须保证启用了binary log记录,并建立一个独一无二的服务器ID。在复制拓扑中的每个服务器都必须被配置为有一个独一无二的服务器id,你可以用server_id系统变量来指定。这个服务器id时用来标识复制拓扑中单独的服务器,必须是1-232-1之间的正数。mysql8.0默认的服务器ID值是1.你可以使用下面的语句动态地改变server_id的值:您可以选择组织和选择服务器ID的方式,只要每个服务器ID与复制拓扑中任何其他服务器使用的ID不同翻译 2020-11-24 21:30:03 · 111 阅读 · 0 评论 -
第17.1.1节 基于binary log文件位置的复制配置概览
这节讨论了基于binary log文件位置的服务器之间的复制方法,充当源(数据库发生更改)的mysql实例把更新和改变作为事件写入binary log。binary log中的信息根据所记录的数据库更改以不同的格式存储。副本被配置为从源读取binary log并在副本的本地数据库执行binary log中的更改。每个副本接收binary log的完整内容的拷贝。决定binary log中的语句是否被执行是副本的责任。除非你额外指定,源的binary log的所有事件都会在从执行。如果需要,你可以配置从来只翻译 2020-11-24 21:29:21 · 74 阅读 · 0 评论 -
第17.1节 配置复制
17.1.1节 基于binary log文件位置的复制配置概览17.1.2节 设置基于binary log文件位置的复制17.1.3节 使用全局事务标识符进行复制17.1.4节 更改在线服务器的GTID模式17.1.5节 mysql多个源的复制17.1.6节 复制和bianry log记录选项和变量17.1.7节 常见的复制管理任务本节介绍如何配置MySQL中可用的不同类型的复制,并包括一个复制环境所需的设置和配置,而这包括了有关创建一个新的复制环境的分步说明。 本节的主要组成部分是: 有翻译 2020-11-24 21:28:35 · 84 阅读 · 0 评论 -
5.9.3 LOCK_ORDER工具
mysql服务器是一个使用了大量内部锁和锁相关原语(例如mutex,rwlocks(包括prlocks和sxlocks),conditions,files)的多线程应用。在服务器内,与锁相关的对象随着新特性的实现和代码重构而改变,以提高性能。如同任何使用了锁原语的多线程应用一样,总会有一些风险,当多个锁同时被持有时会遇到死锁。对mysql来说,死锁的后果是灾难性的,会造成服务的完全丢失。从MySQL 8.0.17开始,为了支持检测锁获取死锁并强制执行时释放死锁,MySQL支持LOCK_ORDER工具。这样翻译 2020-11-19 21:21:42 · 510 阅读 · 0 评论 -
5.9.2 调试mysql客户端
为了使用完整的调试包来调试mysql客户端,你应该使用-DWITH_DEBUG=1来配置mysql.请参见2.9.7节,”mysql源配置选项”在运行客户端之前,你应该设置MYSQL_DEBUG环境变量:这会使客户在/tmp/client.trace中产生一个跟踪文件。如果你对你的客户端代码有疑惑,你应该尝试连接服务器并使用已知可以工作的客户端来进行查询。通过在调试模式下运行mysql来做到这一点(假设您已经在调试打开的情况下编译了MySQL):如果您通过邮件发了错误报告,这将提供有用的信息。翻译 2020-11-19 21:19:18 · 116 阅读 · 0 评论 -
5.9.1.7 如果遇到了表崩溃,请进行测试
接下来的流程适用于MYISAM表。当遇到InnoDB表,关于要执行步骤的信息,参见1.6节”如何报告漏洞(bug)或者问题(problem)”如果遇到损坏的MyISAM表或在某些更新语句后mysqld总是失败,则可以通过执行以下操作来测试问题是否可重现:1. msqladmin shutdown来停止mysql守护程序。2. 对表进行备份,以防万一修复造成不良后果。3. 使用mysiamchk -s database/*.MYI来检查所有的表。使用myisamchk -r database/tab翻译 2020-11-19 21:18:04 · 77 阅读 · 0 评论 -
5.9.1.6 使用服务器日志找出mysqld错误的原因
请注意,在启用general log的情况下启动mysqld之前,应使用myisamchk检查所有表。 请参阅第5章,MySQL服务器管理。如果mysqld挂掉或者hang了,你应该在启用general log的情况下启动mysqld。参见5.4.3节,”普通查询日志”。当mysqld再次挂掉时,你应该检查日志文件的末尾来找出kill掉mysqld的查询。如果你使用默认general log文件,文件会作为host_name.log存储在数据库目录。大多数情况下,是日志文件的最后一条查询kill掉了My翻译 2020-11-19 21:17:34 · 127 阅读 · 0 评论 -
5.9.1.5 使用栈跟踪
在一些操作系统中,如果mysqld意外挂掉,error log会包含一些栈跟踪信息。你可以用它找出哪里(为什么)mysqld挂掉。参见5.4.2节,”error log”。为了得到栈跟踪,你必不能以gcc的-fomit-frame-pointer选项来编译mysqld。参见5.9.1.1节,”为调试编译mysql”error log中的栈跟踪看起来像这样:如果跟踪的函数名称解析失败,则跟踪将包含较少的信息:新版本的glibc栈跟踪功能同样会打印相对于对象的地址。在基于glibc系统(linux),翻译 2020-11-19 21:16:59 · 119 阅读 · 0 评论 -
5.9.1.4 在gdb下调试mysqld
如果mysqld崩溃(crash),在大多系统下你也可以从gdb启动mysqld来获取更多信息。linix上一些较老的gdb版本,如果你想能调试mysqld线程,你必须使用run --one-thread。这种情况下,一次只能激活一个线程。在gdb下运行mysqld时,NTPL线程(linix上的new thread library)可能会有一些问题。一些如下: 在启动期间mysqld hang了(在为连接做好准备之前)。 在pthread_mutex_lock或pthread_mutex_un翻译 2020-11-19 21:15:42 · 350 阅读 · 0 评论 -
5.9.1.2 创建跟踪文件
如果mysqld服务器没有启动或者轻易的crash掉,你可以尝试创建跟踪文件来发现问题。为做这个,你必须使用支持了调试选项的编译过的mysqld。你可以执行mysql d -V来检查。如果版本数字以-debug结束,则它是以支持跟踪文件编译的(在windows上,调试服务器的名字为mysqld-debug而不是mysqld)。在UNIX上使用/tmp/mysqld.trace的跟踪日志启动mysqld服务器或者windows上的\mysqld.trace:在windows上,你也可以使用–stand翻译 2020-11-19 21:14:24 · 73 阅读 · 0 评论 -
5.9.1.1编译MySQL以进行调试
如果你遇到一个特别具体的问题,你随时可以尝试调试Mysql。为了这么做,你必须使用-DWITH_DEBUG=1来配置mysql。你也可以通过使用mysqld --help来检查mysql是否使用了调试编译。如果选项中列出了–debug标识,那么你已经启用了调试选项。mysqladmin ver在这种情况下还将mysqld版本列为mysql … --debug。如果使用-DWITH_DEBUG = 1 CMake选项配置mysqld时,它停止并崩溃,则可能是在MySQL中发现了一个编译器错误或一个计时错误。翻译 2020-11-17 19:38:59 · 202 阅读 · 0 评论 -
5.9.1 Debugging mysql服务器
5.9.1.1编译MySQL以进行调试5.9.1.2创建跟踪文件5.9.1.3使用WER和PDB创建Windows崩溃转储5.9.1.4在gdb下调试mysqld5.9.1.5使用堆栈跟踪5.9.1.6使用服务器日志查找mysqld中的错误原因5.9.1.7如果遇到表损坏,请进行测试如果你正在使用mysql中非常新的功能,你可以试着使用–skip-new选项来启动mysqld(这会禁用所有新的,可能不安全的功能)。参见B.3.3.3节,”如果mysql一直崩溃该做什么”如果mysqld不想启翻译 2020-11-17 19:38:25 · 114 阅读 · 0 评论 -
5.8.4 在多服务器环境下使用客户程序
要将客户程序连接到正在监听不同网络接口的服务器,你可以使用以下策略: 使用–host=host_name --port=port_number来使用TCP/IP连接到一个远程服务器,使用–host=127.0.0.1和–port=port_number来连接到本地服务器,或使用–host=localhost --socket=file_name来使用UNIX socket文件或windows命名管道来连接到本地服务器。 使用–protocol=TCP来使用TCP/IP连接,–protocol=SOC翻译 2020-11-17 19:37:08 · 73 阅读 · 0 评论 -
5.8.3 在UNIX运行多个mysql实例
注意这里的讨论使用mysqld_safe来启动mysql的多个实例。对于使用RPM包的mysql安装,服务器启动和关机是由多个Linux平台上的systemd来管理的。在这些平台上,并没有安装mysqld_safe因为并不必要。关于使用mysqld处理多个mysql实例的信息,请参见2.5.9节,”使用mysqld管理mysql服务器”。一种在UNIX上运行多个mysql实例的方法是使用不同的TCP/IP端口和UNIX socket文件来编译不同的服务器,以便不同的服务器监听不同的网络接口。对于每个安装翻译 2020-11-17 19:36:35 · 100 阅读 · 0 评论 -
5.8.1 设置多个data目录
一台机器上的每个mysql实例应该有自己的data目录。该位置可使用–datadir=dir_name选项来指定。为一个新的实例设置data目录有不同的方法: 创建一个新的data目录 复制一个已存在的data目录接下来的讨论提供了每种方法的细节。警告通常,您不应该有两个服务器来更新同一数据库中的数据。如果你的操作系统不支持fault-free系统锁,那将会导致不愉快的意外发生。如果你在相同data目录下运行了多个服务器并且它们都启用了日志记录,你必须使用适当的选项来指定每个服务器唯一的日志翻译 2020-11-17 19:35:54 · 695 阅读 · 0 评论 -
5.8 在一台机器上运行多个mysql实例
5.8.1 设置多个data目录5.8.2 在windows上运行多个mysql实例[1]5.8.3 在UNIX上运行多个mysql实例5.8.4 在多服务器环境下使用客户端程序一些情况下,你可能想在单台机器上运行多个mysql的实例。你可能想在不影响现有产品设置的情况下,测试新的mysql发布版。或者,你可能想授予不同的用户访问他们自己管理的不同mysqld服务器的权限。(例如,您可能是一个Internet服务提供商,希望为不同的客户提供独立的MySQL安装。)每个实例可以使用不同的MySQL服翻译 2020-11-17 19:34:05 · 124 阅读 · 0 评论 -
5.4.6 服务器日志维护
如在5.4节”mysql服务器日志”中所描述的,mysql服务器可以创建多个不同的日志文件来帮助你查看正在发生的事件。你也可以定期清理这些文件来保证日志不会占用过多磁盘空间。当启用mysql日志记录时,您可能需要不时备份和删除旧的日志文件,并告诉MySQL开始记录新文件。 请参见第7.2节“数据库备份方法”。在linux(RetHat)的安装,你可以使用mysql-log-rotate脚本来维护日志。如果你通过RMP包安装mysql,这个脚本应该已经自动安装了。如果你正在使用复制的binary log,翻译 2020-11-17 19:29:28 · 134 阅读 · 0 评论 -
5.4.5 slow query log
慢查询日志由SQL执行时间超过long_query_time秒的语句组成,并且至少需要检查min_examined_row_limit行。slow query log可以用来找出长时间执行并后续可能优化的查询。但是,检查一个很大的慢查询日志是一项耗时的任务。为了更方便,你可以使用mysqldumpslow命令来处理一个slow query log并概述它的内容。请看4.6.9节,”mysqldumpslow-概述slow query log文件”。获得初始化锁的时间并不计入执行时间。mysqld在执行和释翻译 2020-11-17 19:28:51 · 244 阅读 · 0 评论 -
5.4.3 general query log
常规查询日志是记录mysqld在做什么的常规记录。当客户连接或断联的时候,服务器把信息写入这个日志,它也记录了从客户接收到的每个sql语句。当您怀疑客户端中的错误并且想确切地知道客户端发送到mysqld的内容时,general query log是非常有用的。客户端连接时的日志,还使用了connection_type指示用于建立连接的协议。connection_type是TCP/IP(没有SSL的TCP/IP连接),SSL/TLS(使用SSL的TCP/IP连接),Socket(Unix socket文件连翻译 2020-11-17 19:27:54 · 127 阅读 · 0 评论 -
5.4.1 选择general log和slow query log的输出目标
对于要写入general log和slow query log的日志,mysql对输出目标提供了灵活的控制。日志条目的输出目标可能日志文件或者mysql系统数据库内的general_log和slow_log表。输出到表,文件,或者都可以选择。 在服务器启动时的日志控制 运行时的日志控制 日志表的优点和特性服务器启动时的日志控制log_output系统变量指定了日志输出的目标。设置该变量并不会启动日志,日志必须另外单独启动。 如果启动时没有指定log_output,则默认日志输出目标为FI翻译 2020-11-17 19:26:48 · 228 阅读 · 0 评论