innodb_ruby 0.9.15 → 0.9.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/innodb_log +0 -0
- data/bin/innodb_space +47 -5
- data/lib/innodb/checksum.rb +2 -2
- data/lib/innodb/data_type.rb +2 -1
- data/lib/innodb/inode.rb +43 -0
- data/lib/innodb/record.rb +0 -4
- data/lib/innodb/space.rb +6 -0
- data/lib/innodb/version.rb +1 -1
- metadata +29 -23
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4fb0470eeceb5fbe16a858c30310c5046a8d2512
|
4
|
+
data.tar.gz: f9396fbc702f8b4be752c8300f9dc7cb47317cc2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 001c98d6754675ecfa62f6e93562fc3c398ecfe9f18c869a0685816102dc8d37b0001ebbca317c3aaa0da75616fa5e7669eb537afcad548f301ec61329988f02
|
7
|
+
data.tar.gz: 2ea7115e3ca1fabfa606789ca645605feca86a4bedb5b1fc3dc5a8369d6bd46b653990eb35d70f0b5ee785f77e6983ef9609ebc7e508c89cd0174bdffc1523bf
|
data/bin/innodb_log
CHANGED
File without changes
|
data/bin/innodb_space
CHANGED
@@ -339,6 +339,10 @@ def space_index_pages_summary(space, start_page)
|
|
339
339
|
print_index_page_summary(space.each_page(start_page))
|
340
340
|
end
|
341
341
|
|
342
|
+
def space_index_fseg_pages_summary(space, fseg_id)
|
343
|
+
print_index_page_summary(space.inode(fseg_id).each_page)
|
344
|
+
end
|
345
|
+
|
342
346
|
def space_page_type_regions(space, start_page)
|
343
347
|
puts "%-12s%-12s%-12s%-20s" % [
|
344
348
|
"start",
|
@@ -413,11 +417,12 @@ def space_list_iterate(space, list_name)
|
|
413
417
|
end
|
414
418
|
|
415
419
|
def space_indexes(innodb_system, space)
|
416
|
-
puts "%-12s%-32s%-12s%-12s%-12s%-12s%-12s" % [
|
420
|
+
puts "%-12s%-32s%-12s%-12s%-12s%-12s%-12s%-12s" % [
|
417
421
|
"id",
|
418
422
|
"name",
|
419
423
|
"root",
|
420
424
|
"fseg",
|
425
|
+
"fseg_id",
|
421
426
|
"used",
|
422
427
|
"allocated",
|
423
428
|
"fill_factor",
|
@@ -425,11 +430,12 @@ def space_indexes(innodb_system, space)
|
|
425
430
|
|
426
431
|
space.each_index do |index|
|
427
432
|
index.each_fseg do |fseg_name, fseg|
|
428
|
-
puts "%-12i%-32s%-12i%-12s%-12i%-12i%-12s" % [
|
433
|
+
puts "%-12i%-32s%-12i%-12s%-12i%-12i%-12i%-12s" % [
|
429
434
|
index.id,
|
430
435
|
innodb_system ? innodb_system.index_name_by_id(index.id) : "",
|
431
436
|
index.root.offset,
|
432
437
|
fseg_name,
|
438
|
+
fseg.fseg_id,
|
433
439
|
fseg.used_pages,
|
434
440
|
fseg.total_pages,
|
435
441
|
"%.2f%%" % fseg.fill_factor,
|
@@ -987,6 +993,12 @@ def print_inode_detail(inode)
|
|
987
993
|
]
|
988
994
|
end
|
989
995
|
|
996
|
+
def space_inodes_fseg_id(space)
|
997
|
+
space.each_inode do |inode|
|
998
|
+
puts inode.fseg_id
|
999
|
+
end
|
1000
|
+
end
|
1001
|
+
|
990
1002
|
def space_inodes_summary(space)
|
991
1003
|
space.each_inode do |inode|
|
992
1004
|
print_inode_summary(inode)
|
@@ -1310,7 +1322,8 @@ end
|
|
1310
1322
|
|
1311
1323
|
def page_illustrate(page)
|
1312
1324
|
width = 64
|
1313
|
-
|
1325
|
+
unknown_page_content = page.type == :INDEX && page.record_describer.nil?
|
1326
|
+
blocks = Array.new(page.size, unknown_page_content ? "▞" : " ")
|
1314
1327
|
identifiers = {}
|
1315
1328
|
identifier_sort = 0
|
1316
1329
|
count_by_identifier = Hash.new(0)
|
@@ -1373,12 +1386,19 @@ def page_illustrate(page)
|
|
1373
1386
|
]
|
1374
1387
|
free_space = page.size - count_by_identifier.inject(0) { |sum,(k,v)| sum + v }
|
1375
1388
|
puts " %s %-30s %8i %7.2f%%" % [
|
1376
|
-
" ",
|
1377
|
-
"Free",
|
1389
|
+
unknown_page_content ? "▞" : " ",
|
1390
|
+
unknown_page_content ? "Unknown (no data dictionary)" : "Free",
|
1378
1391
|
free_space,
|
1379
1392
|
100.0 * (free_space.to_f / page.size.to_f),
|
1380
1393
|
]
|
1381
1394
|
|
1395
|
+
if unknown_page_content
|
1396
|
+
puts
|
1397
|
+
puts "Note:"
|
1398
|
+
puts " Records could not be parsed because no data dictionary or record describer"
|
1399
|
+
puts " was available. Use -s instead of -f, or provide a record describer class."
|
1400
|
+
end
|
1401
|
+
|
1382
1402
|
puts
|
1383
1403
|
end
|
1384
1404
|
|
@@ -1639,6 +1659,9 @@ The following options are supported:
|
|
1639
1659
|
--list, -L <list>
|
1640
1660
|
Operate on the list <list>.
|
1641
1661
|
|
1662
|
+
--fseg-id, -F <fseg_id>
|
1663
|
+
Operate on the file segment (fseg) <fseg_id>.
|
1664
|
+
|
1642
1665
|
--require, -r <file>
|
1643
1666
|
Use Ruby's "require" to load the file <file>. This is useful for loading
|
1644
1667
|
classes with record describers.
|
@@ -1673,6 +1696,10 @@ The following modes are supported:
|
|
1673
1696
|
"ALLOCATED" pages are also printed and assumed to be completely empty.
|
1674
1697
|
A starting page number can be provided with the --page/-p argument.
|
1675
1698
|
|
1699
|
+
space-index-fseg-pages-summary
|
1700
|
+
The same as space-index-pages-summary but only iterate one fseg, provided
|
1701
|
+
with the --fseg-id/-F argument.
|
1702
|
+
|
1676
1703
|
space-index-pages-free-plot
|
1677
1704
|
Use Ruby's gnuplot module to produce a scatterplot of page free space for
|
1678
1705
|
all "INDEX" and "ALLOCATED" pages in a tablespace. More aesthetically
|
@@ -1721,6 +1748,9 @@ The following modes are supported:
|
|
1721
1748
|
producing SVG format output, allowing the user to get an overview of page
|
1722
1749
|
modification recency.
|
1723
1750
|
|
1751
|
+
space-inodes-fseg-id
|
1752
|
+
Iterate through all inodes, printing only the FSEG ID.
|
1753
|
+
|
1724
1754
|
space-inodes-summary
|
1725
1755
|
Iterate through all inodes, printing a short summary of each FSEG.
|
1726
1756
|
|
@@ -1814,6 +1844,7 @@ Signal.trap("PIPE") { exit }
|
|
1814
1844
|
@options.record = nil
|
1815
1845
|
@options.level = nil
|
1816
1846
|
@options.list = nil
|
1847
|
+
@options.fseg_id = nil
|
1817
1848
|
@options.describer = nil
|
1818
1849
|
@options.illustration_line_width = 64
|
1819
1850
|
@options.illustration_block_size = 8
|
@@ -1829,6 +1860,7 @@ getopt_options = [
|
|
1829
1860
|
[ "--record", "-R", GetoptLong::REQUIRED_ARGUMENT ],
|
1830
1861
|
[ "--level", "-l", GetoptLong::REQUIRED_ARGUMENT ],
|
1831
1862
|
[ "--list", "-L", GetoptLong::REQUIRED_ARGUMENT ],
|
1863
|
+
[ "--fseg-id", "-F", GetoptLong::REQUIRED_ARGUMENT ],
|
1832
1864
|
[ "--require", "-r", GetoptLong::REQUIRED_ARGUMENT ],
|
1833
1865
|
[ "--describer", "-d", GetoptLong::REQUIRED_ARGUMENT ],
|
1834
1866
|
[ "--illustration-line-width", GetoptLong::REQUIRED_ARGUMENT ],
|
@@ -1859,6 +1891,8 @@ getopt.each do |opt, arg|
|
|
1859
1891
|
@options.level = arg.to_i
|
1860
1892
|
when "--list"
|
1861
1893
|
@options.list = arg.to_sym
|
1894
|
+
when "--fseg-id"
|
1895
|
+
@options.fseg_id = arg.to_i
|
1862
1896
|
when "--require"
|
1863
1897
|
require File.expand_path(arg)
|
1864
1898
|
when "--describer"
|
@@ -1967,6 +2001,10 @@ if [
|
|
1967
2001
|
usage 1, "Record describer must be specified using -d/--describer"
|
1968
2002
|
end
|
1969
2003
|
|
2004
|
+
if ["space-index-fseg-pages-summary"].include?(mode) and !@options.fseg_id
|
2005
|
+
usage 1, "File segment id must be specified using -F/--fseg-id"
|
2006
|
+
end
|
2007
|
+
|
1970
2008
|
if @options.trace > 0
|
1971
2009
|
BufferCursor.trace!
|
1972
2010
|
end
|
@@ -1986,6 +2024,8 @@ when "space-summary"
|
|
1986
2024
|
space_summary(space, @options.page || 0)
|
1987
2025
|
when "space-index-pages-summary"
|
1988
2026
|
space_index_pages_summary(space, @options.page || 0)
|
2027
|
+
when "space-index-fseg-pages-summary"
|
2028
|
+
space_index_fseg_pages_summary(space, @options.fseg_id)
|
1989
2029
|
when "space-index-pages-free-plot"
|
1990
2030
|
file_name = space.name.sub(".ibd", "").sub(/[^a-zA-Z0-9_]/, "_")
|
1991
2031
|
space_index_pages_free_plot(space, file_name, @options.page || 0)
|
@@ -2009,6 +2049,8 @@ when "space-lsn-age-illustrate"
|
|
2009
2049
|
space_lsn_age_illustrate(space)
|
2010
2050
|
when "space-lsn-age-illustrate-svg"
|
2011
2051
|
space_lsn_age_illustrate_svg(space)
|
2052
|
+
when "space-inodes-fseg-id"
|
2053
|
+
space_inodes_fseg_id(space)
|
2012
2054
|
when "space-inodes-summary"
|
2013
2055
|
space_inodes_summary(space)
|
2014
2056
|
when "space-inodes-detail"
|
data/lib/innodb/checksum.rb
CHANGED
@@ -7,14 +7,14 @@ class Innodb::Checksum
|
|
7
7
|
|
8
8
|
# This is derived from ut_fold_ulint_pair in include/ut0rnd.ic in the
|
9
9
|
# InnoDB source code. Since Ruby's Bignum class is *much* slower than its
|
10
|
-
#
|
10
|
+
# Integer class, we mask back to 32 bits to keep things from overflowing
|
11
11
|
# and being promoted to Bignum.
|
12
12
|
def self.fold_pair(n1, n2)
|
13
13
|
(((((((n1 ^ n2 ^ MASK2) << 8) & MAX) + n1) & MAX) ^ MASK1) + n2) & MAX
|
14
14
|
end
|
15
15
|
|
16
16
|
# Iterate through the provided enumerator, which is expected to return a
|
17
|
-
#
|
17
|
+
# Integer (or something coercible to it), and "fold" them together to produce
|
18
18
|
# a single value.
|
19
19
|
def self.fold_enumerator(enumerator)
|
20
20
|
fold = 0
|
data/lib/innodb/data_type.rb
CHANGED
@@ -129,11 +129,12 @@ class Innodb::DataType
|
|
129
129
|
end
|
130
130
|
|
131
131
|
frac << get_digits(stream, mask, @comp_fractional)
|
132
|
+
frac = "0" if frac.empty?
|
132
133
|
|
133
134
|
# Convert to something resembling a string representation.
|
134
135
|
str = mask.to_s.chop + intg + '.' + frac
|
135
136
|
|
136
|
-
BigDecimal
|
137
|
+
BigDecimal(str).to_s('F')
|
137
138
|
end
|
138
139
|
|
139
140
|
private
|
data/lib/innodb/inode.rb
CHANGED
@@ -127,9 +127,52 @@ class Innodb::Inode
|
|
127
127
|
|
128
128
|
# Iterate through all lists, yielding the list name and the list itself.
|
129
129
|
def each_list
|
130
|
+
unless block_given?
|
131
|
+
return enum_for(:each_list)
|
132
|
+
end
|
133
|
+
|
130
134
|
lists.each do |name|
|
131
135
|
yield name, list(name)
|
132
136
|
end
|
137
|
+
|
138
|
+
nil
|
139
|
+
end
|
140
|
+
|
141
|
+
# Iterate through the fragment array followed by all lists, yielding the
|
142
|
+
# page number. This allows a convenient way to identify all pages that are
|
143
|
+
# part of this inode.
|
144
|
+
def each_page_number
|
145
|
+
unless block_given?
|
146
|
+
return enum_for(:each_page_number)
|
147
|
+
end
|
148
|
+
|
149
|
+
frag_array_pages.each do |page_number|
|
150
|
+
yield page_number
|
151
|
+
end
|
152
|
+
|
153
|
+
each_list do |fseg_name, fseg_list|
|
154
|
+
fseg_list.each do |xdes|
|
155
|
+
xdes.each_page_status do |page_number|
|
156
|
+
yield page_number
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
nil
|
162
|
+
end
|
163
|
+
|
164
|
+
# Iterate through the page as associated with this inode using the
|
165
|
+
# each_page_number method, and yield the page number and page.
|
166
|
+
def each_page
|
167
|
+
unless block_given?
|
168
|
+
return enum_for(:each_page)
|
169
|
+
end
|
170
|
+
|
171
|
+
each_page_number do |page_number|
|
172
|
+
yield page_number, space.page(page_number)
|
173
|
+
end
|
174
|
+
|
175
|
+
nil
|
133
176
|
end
|
134
177
|
|
135
178
|
# Compare one Innodb::Inode to another.
|
data/lib/innodb/record.rb
CHANGED
data/lib/innodb/space.rb
CHANGED
@@ -379,6 +379,12 @@ class Innodb::Space
|
|
379
379
|
end
|
380
380
|
end
|
381
381
|
|
382
|
+
# Return an Inode by fseg_id. Iterates through the inode list, but it
|
383
|
+
# normally is fairly small, so should be relatively efficient.
|
384
|
+
def inode(fseg_id)
|
385
|
+
each_inode.select { |inode| inode.fseg_id == fseg_id }.first
|
386
|
+
end
|
387
|
+
|
382
388
|
# Iterate through the page numbers in the doublewrite buffer.
|
383
389
|
def each_doublewrite_page_number
|
384
390
|
return nil unless system_space?
|
data/lib/innodb/version.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: innodb_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.16
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jeremy Cole
|
@@ -10,38 +9,46 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2019-07-28 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: bindata
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- -
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.4'
|
21
|
+
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
23
|
version: 1.4.5
|
23
24
|
type: :runtime
|
24
25
|
prerelease: false
|
25
26
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
27
|
requirements:
|
28
|
-
- -
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '1.4'
|
31
|
+
- - ">="
|
29
32
|
- !ruby/object:Gem::Version
|
30
33
|
version: 1.4.5
|
31
34
|
- !ruby/object:Gem::Dependency
|
32
35
|
name: digest-crc
|
33
36
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
37
|
requirements:
|
36
|
-
- -
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.4'
|
41
|
+
- - ">="
|
37
42
|
- !ruby/object:Gem::Version
|
38
43
|
version: 0.4.1
|
39
44
|
type: :runtime
|
40
45
|
prerelease: false
|
41
46
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
47
|
requirements:
|
44
|
-
- -
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0.4'
|
51
|
+
- - ">="
|
45
52
|
- !ruby/object:Gem::Version
|
46
53
|
version: 0.4.1
|
47
54
|
description: Library for parsing InnoDB data files in Ruby
|
@@ -52,9 +59,11 @@ executables:
|
|
52
59
|
extensions: []
|
53
60
|
extra_rdoc_files: []
|
54
61
|
files:
|
55
|
-
- LICENSE
|
56
62
|
- AUTHORS.md
|
63
|
+
- LICENSE
|
57
64
|
- README.md
|
65
|
+
- bin/innodb_log
|
66
|
+
- bin/innodb_space
|
58
67
|
- lib/innodb.rb
|
59
68
|
- lib/innodb/checksum.rb
|
60
69
|
- lib/innodb/data_dictionary.rb
|
@@ -68,12 +77,12 @@ files:
|
|
68
77
|
- lib/innodb/index.rb
|
69
78
|
- lib/innodb/inode.rb
|
70
79
|
- lib/innodb/list.rb
|
71
|
-
- lib/innodb/lsn.rb
|
72
80
|
- lib/innodb/log.rb
|
73
81
|
- lib/innodb/log_block.rb
|
74
82
|
- lib/innodb/log_group.rb
|
75
|
-
- lib/innodb/log_record.rb
|
76
83
|
- lib/innodb/log_reader.rb
|
84
|
+
- lib/innodb/log_record.rb
|
85
|
+
- lib/innodb/lsn.rb
|
77
86
|
- lib/innodb/page.rb
|
78
87
|
- lib/innodb/page/blob.rb
|
79
88
|
- lib/innodb/page/fsp_hdr_xdes.rb
|
@@ -98,31 +107,28 @@ files:
|
|
98
107
|
- lib/innodb/util/read_bits_at_offset.rb
|
99
108
|
- lib/innodb/version.rb
|
100
109
|
- lib/innodb/xdes.rb
|
101
|
-
- bin/innodb_log
|
102
|
-
- bin/innodb_space
|
103
110
|
homepage: https://github.com/jeremycole/innodb_ruby
|
104
111
|
licenses:
|
105
|
-
-
|
112
|
+
- BSD-3-Clause
|
113
|
+
metadata: {}
|
106
114
|
post_install_message:
|
107
115
|
rdoc_options: []
|
108
116
|
require_paths:
|
109
117
|
- lib
|
110
118
|
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
-
none: false
|
112
119
|
requirements:
|
113
|
-
- -
|
120
|
+
- - ">="
|
114
121
|
- !ruby/object:Gem::Version
|
115
122
|
version: '0'
|
116
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
-
none: false
|
118
124
|
requirements:
|
119
|
-
- -
|
125
|
+
- - ">="
|
120
126
|
- !ruby/object:Gem::Version
|
121
127
|
version: '0'
|
122
128
|
requirements: []
|
123
129
|
rubyforge_project:
|
124
|
-
rubygems_version:
|
130
|
+
rubygems_version: 2.5.2.3
|
125
131
|
signing_key:
|
126
|
-
specification_version:
|
132
|
+
specification_version: 4
|
127
133
|
summary: InnoDB data file parser
|
128
134
|
test_files: []
|