我有几个问题要问那些更熟悉的人。尽管支持 Barracuda,但我的大多数实例都在运行 Antelope。
我正在寻找一些压缩 innodb 表的方法。我的理解是这仅在 Barracuda 格式下可用。
从我读过的和从我的测试中收集到的答案是:是的。是的。我不知道。
更新
自从这篇文章以来,我一直在各种情况下运行一些动态表和一些压缩表,没有出现问题。此外,我 当时忽略了阅读http://dev.mysql.com/doc/refman/5.5/en/innodb-file-format-identifying.html。
启用给定的 innodb_file_format 后,此更改仅适用于新创建的表而不是现有的表。如果您确实创建了一个新表,则包含该表的表空间将使用该表功能所需的“最早”或“最简单”文件格式进行标记。例如,如果您启用文件格式 Barracuda,并创建一个未压缩且不使用 ROW_FORMAT=DYNAMIC 的新表,则包含该表的新表空间将被标记为使用文件格式 Antelope。
因此,即使您允许 Barracuda,表也将创建为 Antelope。混合是不可避免的,除非您将每个表指定为 row_format 动态或压缩表。
没有迹象表明您应该在引入第一个 Barracuda 表时进行完整的转储和重新加载(例如在升级 mysql 的主要版本时推荐)
所以我有一个在复制流上设置的测试数据库服务器。在名称上出现了一个优化,它迅速填满了 slaves 数据目录上的空间。Mysql 尽职尽责地等待更多空间。
这个 datadir 是一个文件系统,只用作 mysql 的 datadir,所以没有其他东西可以释放。
我有一个 4 g innodb 测试表,它不是复制流的一部分,所以我想我会尝试一些东西来看看它是否有效,作为一个测试环境,如果事情出现严重错误,我并不太担心。
这是我采取的步骤
.err 日志中没有显示任何内容,看起来不错。我连接并使用 mydb;并查看我在展示表中弄乱的表。但是,如果我尝试
select * from testtable limit 10;
Run Code Online (Sandbox Code Playgroud)
我收到错误
ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以从所有其他表中读取数据,并且复制开始备份,没有任何抱怨。
我能做些什么来从这一点上恢复过来吗?如果需要,我可以从头开始重建它,但很好奇其他人对这次冒险的总体看法。我采取的一系列步骤是否有任何结果会导致更完美的结果?
如果这不是一个测试服务器,我不能只是“实时运行”看看会发生什么?如果我不得不喜欢,有什么最好的方法可以暂时释放生产从站上的空间?
我们的 QA 环境的所有数据库名称都带有“test”后缀。例如,生产中的 dbname1 在 QA 中会有一个对应的 dbname1test。(这主要是为了防止 prod/qa 配置混淆)。
有一些表我想将实际生产表复制到 QA 中。我不确定我会如何告诉它说“从那里的 dbname1 复制到那里的 dbname1test”
这甚至可能吗?
我有一个拥有 298 个中继 bin 文件的大师,截至今天,可以追溯到 298 天。
.cnf 文件中没有中继日志定义
和
mysql> show variables like '%relay%';
+---------------------------------+----------------+
| Variable_name | Value |
+---------------------------------+----------------+
| innodb_overwrite_relay_log_info | OFF |
| max_relay_log_size | 0 |
| relay_log | |
| relay_log_index | |
| relay_log_info_file | relay-log.info |
| relay_log_purge | ON |
| relay_log_space_limit | 0 |
+---------------------------------+----------------+
Run Code Online (Sandbox Code Playgroud)
重置奴隶会清除它们,但随后它们才开始再生。
知道是什么原因造成的吗?如何阻止它?
对请求的编辑
欢迎对 cnf 进行一般性批评,但让我们记住 OP 主题。
---- cnf request
[mysqld]
character_set_server = utf8
max_connections=200
max_user_connections=160
max_connect_errors=10000
userstat_running = 1
log_warnings
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log …Run Code Online (Sandbox Code Playgroud) 我有一个表,根据 pt-table-checksum (PTC),它显示了主从的一些差异。我发现了除此之外的一些验证差异。
混合中的某些表具有复合主键,虽然对于 PTC 来说工作得很好,但与 pt-table-sync (PTS) 并没有太多尝试找出差异。PTS 似乎不尊重 PTC 的新选项来限制复合键搜索的深度。最终结果是一个 5.5Mrow 的桌子在带有 PTS 的情况下旋转了几个小时。我有点相信 PTS 中存在一个无限循环错误,因为输出刚刚开始一遍又一遍地吐出对相同准确记录(此时没有其他任何内容)的更正。
所以,实际上这篇文章更多的是关于替代品,而不是试图让这个工具正常运行。
想到的最直接的替代方法是在 master 上使用读锁刷新表;select * into outfile on master 和 slave;解锁和差异。然而,这张表相当活跃,我无法承受它在主服务器上被锁定那么久。
我希望做一些事情,比如在可重复读隔离级别开始一个事务,然后从那里的主人那里选择出来。但是,我无法找到一种方法来让从服务器像在主服务器上一样在事务历史记录中的某个点处专门停止。开始事务后,诸如 show master status 之类的内容会继续更新,因此在此之前我不能简单地启动 slave。
不能保证“快速”执行“显示主状态;开始;”的原子性。
非阻塞方法的唯一其他解决方案是编写一个自定义脚本,该脚本可能能够更有效地执行 PTS 类型的操作,但具有有关如何生成相关表的列的特定于应用程序的领域知识。
虽然可能会出现这样的情况,当像 PTS 这样的预制轮子没有我想要的那么圆时,我希望为未来找到一个更通用的解决方案。
我正在尝试让多个 mysql 实例在开发盒上运行以进行一些测试。这家伙正在运行 ubuntu,因此设置与我们的生产设置略有不同。
我想找到最简单的方法来基本上 sudo 服务启动并让它使用不同的 .cnf init 文件(除了 /etc/mysql/my.cnf 的发行版默认位置
有任何想法吗?
有谁知道任何现有的工具/产品可以完成我正在尝试做的事情?
在四处搜索之后,我唯一能找到的围绕我想要完成的事情是其他人在寻找同样的事情http://forums.mysql.com/read.php?24,192250,192250
这个想法是我想捕获到我的主人的所有流量,以针对监控开始时拍摄的整个数据库的快照保存重播日志。Bin 日志不会满足我的需求,因为它们只包含写入。我希望阅读活动能够真实地查看提议的更改对“真实”生产流量的影响。
真正的生产流量意味着来自所有访问数据库的应用程序的所有内容都将被修改。如果应用程序级别发生了某些更改,则仅运行该应用程序的测试不会考虑当时系统中正在进行的其他活动。不能保证在测试环境中运行的所有应用程序都具有相同的数据库状态。当我启动它们时,我可以将测试快照作为起点,但应用程序无法准确重放自己的活动。
我已经使用http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/ 中的 tcpdump 脚本来监视活动,但这并没有告诉我哪些查询来自哪些连接。我想要的部分回放是多线程方法,它从实际使用的相同数量的线程中重放活动。
我负担不起打开常规查询日志记录 b/c 我的生产主机将无法处理性能损失。
整个过程的快照部分是有一个黄金起点数据库,以确保在每次测试运行开始时一切都相同。
为什么要使用 mysqldump 来重新填充表而不是加载数据文件?
这是我的问题的背景故事。我们有一个表的分区不正确。它应该按 PK 划分为 10M 行块。在 90M => 100M 之后,它开始被分区为 100M 行块(100M=>200M 等)。
最近的分区之间有 135M 行,我们决定是时候花一些停机时间来解决这个混乱的问题了。
游戏计划基本上是:
1) mysqldump >= 100M
2) 删除分区 >= 100M
3)创建所需的分区范围
4)通过mysqldump文件读取
这些转储以 10M 块的形式完成,因此我们可以同时重新加载到已关闭的主服务器和从服务器中,并在两者之间进行一些健全性检查,这样我们就不会在意识到自己被搞砸之前走得太远。这是一个仅附加的表,不会发生变化,因此我们能够在真正的停机时间开始之前提前完成历史转储并 scp 到本地副本。因此,我们添加了 --skip-disable-keys,因为我们的 mysql 版本不允许您对每个分区执行此操作,并且不想在每个块之后连续重建,因此这可能与性能差异有关正要布置呢
之前的一些基准测试给我们留下了估计 90 分钟的停机时间。我们错了;mysqldump 重新加载的时间比预期长约 3-4 倍。
我们有一些时间闲逛。应急计划的一部分是在主分区和其他所有分区都重建之前不要丢弃其中一个从分区,“以防万一”。在重建过程中,我们决定进行一个测试,从未触及的从属设备中为我们尚未到达的某些段选择 * 到输出文件中,然后重新加载这些数据文件。
我们制作了转储,对其进行了 gzip 压缩,并将其复制到正在重建过程中的机器上。为了节省一些必须解压缩然后再次读取的开销,我们将其 gzip -dc 放入命名管道中,然后从其中加载。
加载数据方法大约在 4 分钟/块内完成,而不是 mysqldump 重新加载所需的 12-15 分钟。
我知道手册说这对于较大的负载来说可能会更快,但这让我苦苦思索,如果我们的模式已经就位,为什么我们应该使用 mysqldump?
PS 我知道重新组织分区,但发现过去将转储/重新加载到 alteeed 模式中的性能更高。
有谁知道用于 cnf 配置管理的任何好工具?通常情况下,我有一组具有非常相似配置的机器,除了一些差异(例如服务器 ID 或缓冲池以匹配其特定硬件)。
我正在寻找可以设置通用模板的东西,告诉它我想从该模板为该机器生成一些配置,让它提示我需要填写的变量并为我写出 .cnfs .
有没有办法在存储过程中确定您正在运行的服务器的主机名?
您可以从客户端运行系统主机名,但不能从 SP 进行系统调用。我没有看到任何全局变量或状态。
客户端统计表有一个“空查询”列。这意味着什么?简单的谷歌搜索只是告诉我“这个客户端的连接向服务器发送空查询的次数。” /面掌
mysql ×11
replication ×3
innodb ×2
mysql-5.5 ×2
disk-space ×1
my.cnf ×1
mysqldump ×1
partitioning ×1
percona ×1
performance ×1
ubuntu ×1