使用pgloader工具将Grafana的SQLite数据库迁移到PostgreSQL

使用pgloader工具将Grafana的SQLite数据库迁移到PostgreSQL

本文将介绍如何使用pgloader工具将Grafana默认的SQLite数据库迁移到PostgreSQL数据库。我们将讨论迁移的必要性、准备工作和具体步骤,以确保顺利完成迁移过程。

一、引言

Grafana是一个开源的监控和分析解决方案,它默认使用SQLite数据库存储其配置和元数据。然而,随着数据量的增长,SQLite可能无法满足性能和扩展性的需求。因此,将Grafana的数据库迁移到PostgreSQL是一个常见的做法。本文将介绍如何使用pgloader工具完成这一迁移。

二、迁移的必要性

  1. 性能:PostgreSQL提供了更好的并发处理能力和查询性能。
  2. 扩展性:PostgreSQL支持更大的数据集和更高的并发连接数。
  3. 功能:PostgreSQL提供了更丰富的数据类型和功能,如数组、JSON和地理空间数据类型。

三、pgloader安装

pgloader是一个功能强大的数据同步工具,主要用于将数据从各种来源迁移到PostgreSQL数据库中。它支持多种数据源,包括文本文件和多种数据库系统,是数据库迁移和数据导入的理想选择。本指南将详细介绍如何在CentOS系统上通过编译源码的方式安装pgloader,帮助您顺利完成工具部署。

pgloader简介

pgloader是一个专注于高效数据迁移的开源工具,由Lionel Coste开发和维护。它设计的初衷是为了简化和加速从多种数据源到PostgreSQL的迁移过程,特别是当涉及到大量数据时。pgloader具有以下特点:

  • 支持多种数据源:CSV、固定格式、Postgres COPY文本格式、DBF、IXF等文件格式,以及SQLite、MySQL、MSSQLServer、PostgreSQL和Redshift等数据库系统
  • 高效的数据传输:使用PostgreSQL的COPY协议高效传输数据
  • 高度可配置:可以根据需要调整各种参数和选项
  • 易用性:提供简单直观的命令行界面和配置选项

安装概述

pgloader提供了多种安装方式,详见 https://pgloader.readthedocs.io/en/latest/install.html ,主要的安装方式包括:

  • 通过包管理器安装(适用于某些Linux发行版)
  • 从源码编译安装
  • 使用Docker容器
    本指南将重点介绍从源码编译安装的方式,这是在CentOS系统上安装pgloader的主要方法,因为官方尚未提供针对CentOS环境预编译好的程序供下载。

编译安装步骤

下载源码

首先,我们需要从pgloader的官方GitHub仓库下载最新版本的源码。您可以访问以下链接找到下载地址:

https://github.com/dimitri/pgloader

这将下载pgloader 3.6.9版本的源码压缩包。

解压源码

下载完成后,使用以下命令解压源码:

tar -zxvf pgloader-3.6.9.tar.gz

解压后会在当前目录下创建一个名为pgloader-bundle-3.6.9的目录,其中包含了所有必要的源代码和构建脚本。

cd pgloader-bundle-3.6.9

设置脚本执行权限

为了确保所有脚本都能正常执行,需要赋予它们执行权限:

chmod -R 777 *

这将递归地为目录中的所有文件和子目录赋予读、写、执行权限。

执行系统特定脚本

pgloader提供了针对不同操作系统的bootstrap脚本,用于下载必要的依赖项。对于CentOS 7系统,我们需要执行:

bootstrap-centos7.sh

这个脚本会自动下载并安装构建pgloader所需的各种依赖项。如果您使用的是其他版本的CentOS或不同的Linux发行版,请根据实际情况选择对应的bootstrap脚本。

安装依赖项

在执行编译命令之前,系统可能会提示缺少某些依赖项。以下是解决常见依赖项缺失问题的方法:

OpenSSL依赖

如果编译过程中提示缺少libcrypto相关库,首先需要安装OpenSSL及其开发库:

yum -y install openssl openssl-devel

Freetds依赖

如果遇到与Sybase相关的错误,需要安装Freetds:

yum install freetds

SBCL依赖

SBCL(Steel Bank Common Lisp)是一个Lisp解释器,pgloader编译过程中需要使用到。如果缺少SBCL,可以使用以下命令安装:

yum install sbcl

如果您使用的是基于RPM的系统,但上述命令无法正常工作,可以尝试从RPM包安装。例如打开网站 https://rpmfind.net/linux/rpm2html/search.php,搜索并下载lib64crypto3

wget 'https://rpmfind.net/linux/openmandriva/5.0/repository/x86_64/main/release/lib64crypto3-3.1.4-1-omv2390.x86_64.rpm'
rpm -ivh 'lib64crypto3-3.1.4-1-omv2390.x86_64.rpm'

编译pgloader

安装完所有依赖项后,可以执行编译命令:

make pgloader

编译过程中,您可能会看到类似以下的输出,这表示编译正在正常进行:

;; loading system "cffi"
;; loading system "cl+ssl"
;; loading system "mssql"
;; loading file #P"/root/pgloader-bundle-3.6.9/local-projects/pgloader-3.6.9/src/hooks.lisp"
;; loading system "pgloader"
compressed 0 bytes into 8 at level -1
compressed 32768 bytes into 630 at level -1
compressed 3080192 bytes into 831075 at level -1

安装pgloader

编译成功后,将生成的pgloader可执行文件复制到系统执行目录:

cp /usr/local/pgloader-3.6.9/build/bin/pgloader /usr/local/bin/

这样设置后,您就可以在系统的任何位置直接调用pgloader命令,而无需指定完整路径。

验证安装

最后,验证pgloader是否安装成功:

pgloader --version

如果输出类似以下信息,表示安装成功:

pgloader version "3.6.9"
compiled with SBCL 2.3.1-bp155.1.27-suse

这表明pgloader已经成功安装在您的系统上,可以开始使用了。

四、数据迁移

准备数据

Grafana使用SQLite作为数据库,数据存储在/var/lib/grafana目录下的grafana.db文件中。在迁移前,需要将该文件复制到已安装pgloader的机器上。

使用pgloader进行数据迁移

pgloader提供了两种使用方式:通过命令行和通过配置文件。对于将SQLite数据迁移到PostgreSQL,推荐使用配置文件方式。

创建迁移配置文件

创建一个名为grafana.load的文件,内容如下:

load database
  from sqlite:///tmp/grafana.db
  into postgresql://db_user:db_password@db_host:5432/database_name?sslmode=prefer
  
 WITH include drop, create tables, create indexes, reset sequences
 SET work_mem to '128MB', maintenance_work_mem to '512 MB';

配置文件各部分说明:

  • LOAD DATABASE:表示从数据库执行迁移
  • FROM:源数据库连接信息
  • INTO:目标数据库连接信息
  • WITH include drop, create tables, create indexes, reset sequences:指定迁移选项,包括删除现有对象、创建表和索引、重置序列
  • SET work_mem to '128MB', maintenance_work_mem to '512 MB':设置PostgreSQL的工作内存和维护工作内存

执行迁移命令

运行以下命令执行数据迁移:

pgloader grafana.load

迁移日志分析

执行迁移命令后,pgloader会输出详细的日志信息。以下是迁移日志示例:

pgloader a.load
2025-04-17T05:58:55.010000Z LOG pgloader version "3.6.9"
2025-04-17T05:58:55.199997Z LOG Migrating from #<SQLITE-CONNECTION sqlite:///tmp/grafana.db {10065BE673}>
2025-04-17T05:58:55.199997Z LOG Migrating into #<PGSQL-CONNECTION pgsql://dba_user@rds-pg-logcenter-prod-1.c1ey64os2zaq.rds.cn-northwest-1.amazonaws.com.cn:5432/lc_prod {10065BE6F3}>
2025-04-17T05:58:58.849940Z WARNING PostgreSQL warning: identifier "idx_16569_uqe_alert_notification_state_org_id_alert_id_notifier_id" will be truncated to "idx_16569_uqe_alert_notification_state_org_id_alert_id_notifier"
2025-04-17T05:59:00.919907Z WARNING PostgreSQL warning: identifier "idx_16689_idx_alert_rule_version_rule_org_id_rule_namespace_uid_rule_group" will be truncated to "idx_16689_idx_alert_rule_version_rule_org_id_rule_namespace_uid"
2025-04-17T05:59:01.169903Z WARNING PostgreSQL warning: identifier "idx_16745_uqe_library_element_connection_element_id_kind_connection_id" will be truncated to "idx_16745_uqe_library_element_connection_element_id_kind_connec"
2025-04-17T05:59:01.719896Z WARNING PostgreSQL warning: identifier "idx_16792_uqe_user_role_org_id_user_id_role_id_group_mapping_uid" will be truncated to "idx_16792_uqe_user_role_org_id_user_id_role_id_group_mapping_ui"
2025-04-17T05:59:04.109857Z ERROR PostgreSQL Database error 42P16: multiple primary keys for table "cache_data" are not allowed
QUERY: ALTER TABLE cache_data ADD PRIMARY KEY USING INDEX idx_16654_sqlite_autoindex_cache_data_1;
2025-04-17T05:59:04.249855Z ERROR PostgreSQL Database error 42P16: multiple primary keys for table "dashboard_public" are not allowed
QUERY: ALTER TABLE dashboard_public ADD PRIMARY KEY USING INDEX idx_16840_sqlite_autoindex_dashboard_public_1;
2025-04-17T05:59:04.339853Z LOG report summary reset
                 table name     errors       rows      bytes      total time
---------------------------  ---------  ---------  ---------  --------------
                      fetch          0          0                     0.000s
            fetch meta data          0        292                     0.040s
             Create Schemas          0          0                     0.000s
           Create SQL Types          0          0                     0.010s
              Create tables          0        152                     0.780s
             Set Table OIDs          0         76                     0.000s
---------------------------  ---------  ---------  ---------  --------------
              migration_log          0        629   102.3 kB          0.160s
                     "user"          0         21     3.6 kB          0.170s
                       star          0          0                     0.410s
                   org_user          0         28     1.5 kB          0.490s
                  dashboard          0         85     2.3 MB          0.920s
                  temp_user          0          0                     0.410s
                        org          0          1     0.1 kB          0.750s
              dashboard_tag          0         39     1.4 kB          0.750s
     dashboard_provisioning          0          0                     0.980s
                    api_key          0          0                     0.980s
                      quota          0          0                     1.250s
                   playlist          0          0                     1.280s
                preferences          0          6     1.0 kB          1.530s
             alert_rule_tag          0          0                     1.580s
   alert_notification_state          0          0                     1.820s
             annotation_tag          0          0                     1.890s
          dashboard_version          0        289     8.9 MB          2.710s
                data_source          0         45    17.5 kB          0.870s
         dashboard_snapshot          0          0                     1.170s
                    session          0          0                     1.150s
              playlist_item          0          0                     1.470s
                      alert          0          0                     1.410s
         alert_notification          0          0                     1.710s
                 annotation          0      26125     9.7 MB          2.710s
                team_member          0         70     3.7 kB          2.040s
                        tag          0          0                     2.260s
                  user_auth          0         24    41.2 kB          2.550s
            user_auth_token          0         11     3.4 kB          2.810s
                  short_url          0          0                     2.920s
                 alert_rule          0         20    34.4 kB          3.170s
        alert_configuration          0          1     8.4 kB          3.310s
            provenance_type          0         13     0.4 kB          3.450s
alert_configuration_history          0        102     1.2 MB          3.670s
 library_element_connection          0          0                     3.720s
                    secrets          0         45     8.5 kB          3.930s
                 permission          0       1974   239.0 kB          4.020s
                  team_role          0         15     0.4 kB          4.240s
               builtin_role          0          2     0.1 kB          4.310s
      query_history_details          0          3     0.1 kB          4.560s
                correlation          0          0                     4.620s
           dashboard_public          0          0                     4.850s
                  file_meta          0          0                     4.930s
                     folder          0         18     1.6 kB          5.140s
                signing_key          0          3     1.5 kB          5.230s
    cloud_migration_session          0          0                     5.410s
   cloud_migration_resource          0          0                     5.490s
             plugin_setting          0          0                     5.690s
                   resource          0          0                     5.700s
           resource_version          0          0                     6.000s
                  test_data          0          0                     1.590s
                       team          0         15     1.1 kB          1.960s
              dashboard_acl          0          2     0.1 kB          2.160s
              login_attempt          0          0                     2.390s
                server_lock          0          3     0.1 kB          2.670s
                 cache_data          0          5    14.5 kB          2.690s
             alert_instance          0        359   164.7 kB          3.070s
         alert_rule_version          0        519   702.8 kB          3.130s
      ngalert_configuration          0          0                     3.310s
                alert_image          0          0                     3.370s
            library_element          0          0                     3.580s
                  data_keys          0         35     7.2 kB          3.640s
                   kv_store          0         11     3.4 kB          3.800s
                       role          0         38     3.6 kB          3.930s
                  user_role          0         18     0.5 kB          4.090s
              query_history          0          3     0.6 kB          4.190s
         query_history_star          0          0                     4.400s
               entity_event          0          0                     4.470s
                       file          0          0                     4.710s
            seed_assignment          0          0                     4.810s
                anon_device          0          0                     4.970s
                sso_setting          0          1     1.4 kB          5.090s
   cloud_migration_snapshot          0          0                     5.230s
      user_external_session          0          7    15.1 kB          5.470s
     resource_migration_log          0         22     3.8 kB          5.490s
           resource_history          0          0                     5.780s
              resource_blob          0          0                     5.740s
---------------------------  ---------  ---------  ---------  --------------
    COPY Threads Completion          0          4                     6.210s
             Create Indexes          0        216                     3.510s
     Index Build Completion          0        216                     0.920s
            Reset Sequences          0         36                     0.160s
               Primary Keys          2         73                     0.730s
        Create Foreign Keys          0          0                     0.000s
            Create Triggers          0          0                     0.000s
           Install Comments          0          0                     0.000s
---------------------------  ---------  ---------  ---------  --------------
          Total import time          ✓      30607    23.4 MB         11.530s

迁移成功与否的判断

查看最后一行输出日志,可以看到迁移是否成功。在上述示例中,Total import time前的表示迁移成功。如果看到数字则表示迁移失败。

pgloader grafana.load
2023-05-29T15:24:09.004954-04:00 LOG pgloader version "3.6.9"
2023-05-29T15:24:09.006273-04:00 LOG Data errors in '/private/tmp/pgloader/'
2023-05-29T15:24:09.006308-04:00 LOG Parsing commands from file #P"/.../grafana.load"
2023-05-29T15:24:09.678189-04:00 LOG Migrating from #<SQLITE-CONNECTION sqlite:///.../grafana.db {700E9F0973}>
2023-05-29T15:24:09.678306-04:00 LOG Migrating into #<PGSQL-CONNECTION pgsql://XXX>
2023-05-29T15:24:10.654083-04:00 WARNING Source column "public"."migration_log"."id" is casted to type "bigserial" which is not the same as "integer", the type of current target database column "public"."migration_log"."id".
2023-05-29T15:24:10.654547-04:00 WARNING Source column "public"."migration_log"."migration_id" is casted to type "text" which is not the same as "character varying", the type of current target database column "public"."migration_log"."migration_id".
2023-05-29T15:24:10.654616-04:00 WARNING Source column "public"."migration_log"."success" is casted to type "bigint" which is not the same as "boolean", the type of current target database column "public"."migration_log"."success".
[...]
2023-05-29T13:32:12.794507-04:00 ERROR Database error 23505: duplicate key value violates unique constraint "org_pkey"
DETAIL: Key (id)=(1) already exists.
CONTEXT: COPY org, line 1
2023-05-29T13:32:13.285749-04:00 ERROR Database error 23505: duplicate key value violates unique constraint "user_pkey1"
DETAIL: Key (id)=(1) already exists.
CONTEXT: COPY user, line 1
2023-05-29T13:32:13.286581-04:00 ERROR Database error 23505: duplicate key value violates unique constraint "migration_log_pkey"
DETAIL: Key (id)=(1) already exists.
CONTEXT: COPY migration_log, line 1
2023-05-29T13:32:14.479374-04:00 ERROR Database error 23505: duplicate key value violates unique constraint "org_user_pkey"
DETAIL: Key (id)=(1) already exists.
CONTEXT: COPY org_user, line 1
2023-05-29T13:32:16.676660-04:00 ERROR Database error 23505: duplicate key value violates unique constraint "dashboard_acl_pkey"
DETAIL: Key (id)=(1) already exists.
CONTEXT: COPY dashboard_acl, line 1
2023-05-29T13:32:17.304534-04:00 ERROR Database error 23505: duplicate key value violates unique constraint "UQE_server_lock_operation_uid"
DETAIL: Key (operation_uid)=(cleanup expired auth tokens) already exists.
CONTEXT: COPY server_lock, line 1
2023-05-29T13:32:20.856544-04:00 ERROR Database error 23505: duplicate key value violates unique constraint "kv_store_pkey"
DETAIL: Key (id)=(1) already exists.
CONTEXT: COPY kv_store, line 1
2023-05-29T13:32:28.301681-04:00 LOG report summary reset
                table name     errors       rows      bytes      total time
--------------------------  ---------  ---------  ---------  --------------
                     fetch          0          0                     0.000s
           fetch meta data          0         61                     0.044s
         Drop Foreign Keys          0          0                     0.000s
--------------------------  ---------  ---------  ---------  --------------
[...]
--------------------------  ---------  ---------  ---------  --------------
   COPY Threads Completion          0          4                    12.382s
           Reset Sequences          0         53                     2.523s
       Create Foreign Keys          0          0                     0.000s
          Install Comments          0          0                     0.000s
--------------------------  ---------  ---------  ---------  --------------
         Total import time          7        538     4.9 MB         14.905s

由于我们现在的数据库处于未知状态(一些表已迁移,一些表失败),我们希望从干净的状态重新启动。

从 Postgres 数据库中删除 Grafana 数据库并重新创建,重新启动 Grafana 以使其再次构建架构,然后将其关闭。

在 Postgres 数据库中,您需要截断所有失败的表,以删除所有与现有数据冲突的自动生成的行。

posted @ 2025-04-17 17:17  Donaver  阅读(322)  评论(0)    收藏  举报