新手教程 配置 EOS 同步主网数据到 Mysql

Surou · 2018年09月17日 · 最后由 Surou 回复于 2018年11月20日 · 687 次阅读
本帖已被设为精华帖!

EOS编译安装,请参考编译EOS主网EOS-Mainnet代码并支持sql_db_plugin

一. 修改Config配置

先运行下nodeos,将会自动创建~/.local/share/eosio/nodeos/config目录和config.ini文件。 修改config.ini中如下内容

//添加 (2018-8-18 此时可用,如果有想分享的节点,请私聊我)
p2p-peer-address = fullnode.eoslaomao.com:443
p2p-peer-address = mars.fnp2p.eosbixin.com:443
//修改 可忽略
agent-name = "BcSkill"
//如果需要返回错误信息,修改
verbose-http-errors = true
//添加插件支持
plugin = eosio::chain_plugin
plugin = eosio::net_plugin
plugin = eosio::sql_db_plugin
//修改mongodb插件相关配置
sql_db-uri = mysql://db=eos user=root host=127.0.0.1 password='pwd'

二. 安装配置并启动MySql

1. 安装MySql

先安装MySql 参考 Ubuntu 安装MySql 8.0

2. 配置MySql

  • 接下来我们安装 soci。soci 是 C++ 连接 MySQL 的 Library。Ubuntu 可以快速安装,命令如下: shell sudo apt-get -y install libsoci-dev
  • 安装 mysql-client shell sudo apt-get -y install mysql-client sudo apt-get install libmysqlclient-dev

由于链上数据较大,比如1000W块左右的数据,离线压缩包大约14GB,同步到MySql大概需要200GB左右。所以需要将MySql数据单独磁盘存储。 修改MySql数据存储位置,/mnt/data为我这边挂载的存储盘 新建目录mkdir /mnt/data/MySql 并参考 Ubuntu16.04下修改MySQL数据的默认存储位置

配置Eos数据库

  • 进入mysql shell mysql -p
  • 创建数据库 shell CREATE DATABASE eos DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 查看数据库 shell mysql > show databases;

三. 下载主网离线数据包

参考 EOS 主网数据更新,离线数据包 因为使用离线包可以加快追上主网的进度,如果从零自己同步到主网进度,难以想象要多久... 假设已经将离线数据下载并解压到了 /mnt/data/data目录下。

四. 启动nodeos开始同步数据

nodeos --data-dir /mnt/data/data --hard-replay-blockchain --replay-blockchain
第一次运行 必须添加 --replay-blockchain参数,不然不会创建数据库表,参考下面代码

如果需要清空mysql数据库的话,添加--sql_db-block-start=0 --replay-blockchain 相关代码如下eos\plugins\sql_db_plugin\sql_db_plugin.cpp

void sql_db_plugin::plugin_initialize(const variables_map& options)
{
    ilog("initialize");
    try {
        std::string uri_str = options.at(SQL_DB_URI_OPTION).as<std::string>();
        if (uri_str.empty())
        {
            wlog("db URI not specified => eosio::sql_db_plugin disabled.");
            return;
        }
        ilog("connecting to ${u}", ("u", uri_str));
        uint32_t block_num_start = options.at(BLOCK_START_OPTION).as<uint32_t>();
        auto db = std::make_unique<database>(uri_str, block_num_start);

        if (options.at(HARD_REPLAY_OPTION).as<bool>() ||
                options.at(REPLAY_OPTION).as<bool>() ||
                options.at(RESYNC_OPTION).as<bool>() ||
                !db->is_started())
        {
            if (block_num_start == 0) {
                ilog("Resync requested: wiping database");
                if( options.at( RESYNC_OPTION ).as<bool>() ||
                        options.at( REPLAY_OPTION ).as<bool>()) {
                    ilog( "Resync requested: wiping database" );
                    db->wipe();
                }
            }
        }

此时已开始,同步中

五. 服务器建议配置

内存:32GB 存储:1T+

共收到 6 条回复

添加了plugin = eosio::sql_db_plugin,配置文件配置了这个sql_db-uri = mysql://db=eos user=root host=127.0.0.1 password='pwd' 启动会报错,

你是哪个仓库 哪个分支的代码各个 人维护的 mysql 插件 不一样的。你看下你仓库下 mysql 插件的源码,看有没有对应的sql_db-uri参数,看是不是不支持,或者改名了?

Surou 将本帖设为了精华贴 10月23日 16:28
4楼 已删除

在 replay的 BLOCKS 好像只有小部份寫到 MYSQL 中。。。我 COUNT 才 500-1000 個,試了好幾回

BLOCK 表中只見到 2018-06-09 的 BLOCK,估計是在用極慢的速度寫入

keithyau 回复

查下机器的硬件资源占用,注意下cpu和磁盘的io,看看慢在哪

Surou 回复

發現了即使 REPLAY 完成 MYSQL 中只有 幾千個 TRANSACTIONS,都是 18-06-09 的。。但 MONGO 不會,感覺是寫入不成功,而不是慢。

keithyau 回复

不知道你mysql 用的那个组织维护的,如果没有特殊需求的话,还是建议使用mongodb plugin,毕竟eosio官方主推,并且相对的使用的用户要多一些,问题修复会更及时。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册