Add MergeTree Write-Ahead-Log(WAL) dump tool

This commit is contained in:
BohuTANG 2020-08-12 13:50:22 +08:00
parent 4c5d7cd733
commit c31f4f013a
3 changed files with 81 additions and 0 deletions

View File

@ -28,6 +28,7 @@ if (NOT DEFINED ENABLE_UTILS OR ENABLE_UTILS)
add_subdirectory (test-data-generator) add_subdirectory (test-data-generator)
add_subdirectory (convert-month-partitioned-parts) add_subdirectory (convert-month-partitioned-parts)
add_subdirectory (checksum-for-compressed-block) add_subdirectory (checksum-for-compressed-block)
add_subdirectory (wal-dump)
endif () endif ()
if (ENABLE_CODE_QUALITY) if (ENABLE_CODE_QUALITY)

View File

@ -0,0 +1,2 @@
add_executable (wal-dump main.cpp)
target_link_libraries(wal-dump PRIVATE dbms boost::program_options)

78
utils/wal-dump/main.cpp Normal file
View File

@ -0,0 +1,78 @@
#include <iostream>
#include <boost/program_options.hpp>
#include <Compression/CompressedReadBuffer.h>
#include <Compression/CompressedReadBufferFromFile.h>
#include <Compression/CompressedWriteBuffer.h>
#include <DataStreams/NativeBlockInputStream.h>
#include <IO/Operators.h>
#include <IO/ReadBufferFromFile.h>
#include <IO/ReadHelpers.h>
#include <IO/WriteBufferFromFileDescriptor.h>
#include <Storages/MergeTree/MergeTreeWriteAheadLog.h>
/*
* Dump the Write Ahead Log file, outputs:
* Part 0, Version: 0, Action : ADD_PART, Name: 4_1_1_0, Block:
a Int32 Int32(size = 2), b Int32 Int32(size = 2), c Int32 Int32(size = 2)
*/
static void dump(const std::string & bin_path)
{
DB::ReadBufferFromFile in(bin_path);
DB::NativeBlockInputStream block_in(in, 0);
DB::Block block;
DB::WriteBufferFromFileDescriptor out(STDOUT_FILENO);
for (size_t part_num = 0; !in.eof(); ++part_num)
{
UInt8 version;
String part_name;
DB::MergeTreeWriteAheadLog::ActionType action_type;
DB::readIntBinary(version, in);
DB::readIntBinary(action_type, in);
DB::readStringBinary(part_name, in);
block = block_in.read();
out << "Part " << part_num << ", Version: " << version
<< ", Action : " << (action_type == DB::MergeTreeWriteAheadLog::ActionType::ADD_PART ? "ADD_PART" : "DROP_PART")
<< ", Name: " << part_name << ", Block:\n";
out << block.dumpStructure() << "\n";
out << "\n" << DB::flush;
}
}
int main(int argc, char ** argv)
{
boost::program_options::options_description desc("Allowed options");
desc.add_options()("help,h", "produce help message");
boost::program_options::variables_map options;
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), options);
if (options.count("help") || argc != 2)
{
std::cout << "Usage: " << argv[0] << " wal.bin" << std::endl;
std::cout << desc << std::endl;
return 1;
}
try
{
dump(argv[1]);
}
catch (const DB::Exception & e)
{
std::cerr << e.what() << ", " << e.message() << std::endl
<< std::endl
<< "Stack trace:" << std::endl
<< e.getStackTraceString() << std::endl;
throw;
}
return 0;
}