All pages
Powered by GitBook
1 of 72

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Topologies

This section explains various deployment architectures, including standalone, replication, and clustering, to help you design scalable and highly available database solutions.

Step 5: Install MariaDB MaxScale

Overview

This page details step 5 of the 7-step procedure "Deploy Primary/Replica Topology".

This step install MariaDB MaxScale 25.01.

The MaxScale node must meet requirements.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Customer Download Token

MariaDB Corporation provides package repositories for YUM (RHEL, CentOS), APT (Debian, Ubuntu), and ZYpp (SLES). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On the MaxScale node, install the prerequisites for downloading the software from the Web.

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Install on SLES (ZYpp):

  1. On the MaxScale node, configure package repositories and specify MariaDB MaxScale 25.01:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install MaxScale

On the MaxScale node, install MariaDB MaxScale.

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Install on SLES (ZYpp):

Next Step

Navigation in the procedure "Deploy Primary/Replica Topology":

This page was step 5 of 7.

Next: Step 6: Start and Configure MariaDB MaxScale

Step 9: Import Data

Overview

This page details step 9 of the 9-step procedure "".

This step bulk imports data to Enterprise ColumnStore.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Step 6: Install MariaDB MaxScale

Overview

This page details step 6 of the 9-step procedure "".

This step installs MariaDB MaxScale 22.08.

ColumnStore Object Storage requires 1 or more MaxScale nodes.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Step 3: Install MariaDB Enterprise Server

Overview

This page details step 3 of the 9-step procedure "".

This step installs MariaDB Enterprise Server, MariaDB Enterprise ColumnStore 23.10, CMAPI, and dependencies.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Single Node Topologies

Overview

Installation and configuration instructions are available for the deployment of single-node topologies of MariaDB Enterprise Server and MariaDB Community Server.

MariaDB ColumnStore

These instructions detail a single-node deployment of a columnar data store, for MariaDB Community Server, with data optionally stored on S3-compatible object storage:

MariaDB Enterprise Spider Topologies

Explore MariaDB Enterprise Spider topologies with MaxScale. This section details how it integrates with Spider to manage & route traffic efficiently across sharded & distributed database environments.

See Also

  • Single-Node ColumnStore Topology with MariaDB Community Server

For high availability and scalability, see "Enterprise ColumnStore with Object Storage" or "Enterprise ColumnStore with Shared Local Storage".

MariaDB Community Server

These instructions detail a single-node deployment of MariaDB Community Server:

  • Single-Node Server Topology with MariaDB Community Server

MariaDB Enterprise ColumnStore with Local Storage

These instructions detail a single-node deployment of a columnar data store:

  • Single-Node Enterprise ColumnStore Local Storage Topology with MariaDB Enterprise Server

For high availability and scalability, see "Enterprise ColumnStore with Shared Local Storage".

MariaDB Enterprise ColumnStore with Object Storage

These instructions detail a single-node deployment of a columnar data store for MariaDB Enterprise Server, with data stored on S3-compatible object storage:

  • Single-Node Enterprise ColumnStore Object Storage Topology with MariaDB Enterprise Server

For high availability and scalability, see "Enterprise ColumnStore with Object Storage".

MariaDB Enterprise Server

These instructions detail a single-node deployment of MariaDB Enterprise Server:

  • Single-Node Enterprise Server Topology with MariaDB Enterprise Server

\

Compatibility

Operating System support varies by product and product version. Operating System support is detailed in MariaDB plc Engineering Policies.

Import the Schema

Before data can be imported into the tables, create a matching schema.

On the primary server, create the schema:

  1. For each database that you are importing, create the database with the CREATE DATABASE statement:

  1. For each table that you are importing, create the table with the CREATE TABLE statement:

Import the Data

Enterprise ColumnStore supports multiple methods to import data into ColumnStore tables.

Interface
Method
Benefits

Shell

  • SQL access is not required

SQL

  • Shell access is not required

Remote Database

  • Use normal database client

  • Avoid dumping data to intermediate filed

cpimport

MariaDB Enterprise ColumnStore includes cpimport, which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server run cpimport:

LOAD DATA INFILE

When data is loaded with the LOAD DATA INFILE statement, MariaDB Enterprise ColumnStore loads the data using cpimport, which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server use LOAD DATA INFILE statement:

Import from Remote Database

MariaDB Enterprise ColumnStore can also import data directly from a remote database. A simple method is to query the table using the SELECT statement, and then pipe the results into cpimport, which is a command-line utility that is designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a remote MariaDB database:

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 9 of 9.

This procedure is complete.

This page is: Copyright © 2025 MariaDB. All rights reserved.

Deploy ColumnStore Object Storage Topology
Retrieve Customer Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to https://customers.mariadb.com/downloads/token/

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On the MaxScale node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On the MaxScale node, configure package repositories and specify MariaDB MaxScale 22.08:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the Versions section at the bottom of the MariaDB Package Repository Setup and Usage page. Substitute ${checksum} in the example above with the latest checksum.

Install MaxScale

On the MaxScale node, install MariaDB MaxScale.

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 6 of 9.

Next: Step 7: Start and Configure MariaDB MaxScale.

Deploy ColumnStore Object Storage Topology
Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to https://customers.mariadb.com/downloads/token/

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the Versions section at the bottom of the MariaDB Package Repository Setup and Usage page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise Server and Enterprise ColumnStore

  1. On each Enterprise ColumnStore node, install additional dependencies:

Install on CentOS and RHEL (YUM):

Install on Debian 9 and Ubuntu 18.04 (APT)

Install on Debian 10 and Ubuntu 20.04 (APT):

  1. On each Enterprise ColumnStore node, install MariaDB Enterprise Server and MariaDB Enterprise ColumnStore:

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

This page was step 3 of 9.

Next: Step 4: Start and Configure MariaDB Enterprise Server.

Deploy ColumnStore Shared Local Storage Topology
https://customers.mariadb.com/downloads/token/
Versions
MariaDB Package Repository Setup and Usage
Federated MariaDB Enterprise Spider Topology
ODBC MariaDB Enterprise Spider Topology
Sharded MariaDB Enterprise Spider Topology
MariaDB Enterprise Spider Operations

Step 3: Install MariaDB Enterprise Server

Overview

This page details step 3 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step installs MariaDB Enterprise Server, MariaDB Enterprise ColumnStore 23.10, CMAPI, and dependencies.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise Server and Enterprise ColumnStore

  1. On each Enterprise ColumnStore node, install additional dependencies:

Install on CentOS and RHEL (YUM):

Install on Debian 9 and Ubuntu 18.04 (APT)

Install on Debian 10 and Ubuntu 20.04 (APT):

  1. On each Enterprise ColumnStore node, install MariaDB Enterprise Server and MariaDB Enterprise ColumnStore:

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology".

This page was step 3 of 9.

Next: Step 4: Start and Configure MariaDB Enterprise Server.

Topologies Overview

MariaDB offers varied deployment topologies by workload and technology, each named and diagrammed with benefits listed. Custom configurations are also supported.

MariaDB products can be deployed in many different topologies. The topologies described in this section are representative. MariaDB products can be deployed to form other topologies, leverage advanced product capabilities, or combine the capabilities of multiple topologies.

Topologies are the arrangement of nodes and links to achieve a purpose. This documentation describes a few of the many topologies that can be deployed using MariaDB database products.

We group topologies by workload (transactional, analytical, hybrid) and technologies (Enterprise Spider). Single-node topologies are listed separately.

To help you select the correct topology:

  • Each topology is named and this name is used consistently throughout the documentation.

  • A thumbnail diagram provides a small-scale summary of the topology's architecture.

  • Finally, we provide a list of the benefits of the topology.

Although multiple topologies are listed on this page, the listed topologies are not the only options. MariaDB products are flexible, configurable, and extensible, so it possible to deploy different topologies that combine the capabilities of multiple topologies listed on this page. The topologies listed on this page are primarily intended to be representative of the most commonly requested use cases.

Transactional (OLTP)

Primary/Replica Topology

Diagram
Features

Galera Cluster Topology

Diagram
Features

Analytical (OLAP, Data Warehousing, DSS)

ColumnStore Object Storage Topology

Diagram
Features

ColumnStore Shared Local Storage Topology

Diagram
Features

Hybrid Workloads

HTAP Topology

Diagram
Features

Spider Topologies

Spider Federated Topology

Diagram
Features

Spider Sharded Topology

Diagram
Features

Single Node Topologies

Step 1: Install MariaDB Enterprise Server

Overview

This page details step 1 of the 7-step procedure "Deploy Primary/Replica Topology".

This step installs MariaDB Enterprise Server

The Primary/Replica topology requires 3 or more MariaDB Enterprise Server nodes for High Availability (HA). Nodes must meet requirements.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise Server

  1. On each Enterprise Cluster node, install MariaDB Enterprise Server and MariaDB Enterprise Backup.

Install via CentOS / RHEL (YUM):

Install via Debian / Ubuntu (APT):

Install via SLES (ZYpp):

Next Step

Navigation in the procedure "Deploy Primary/Replica Topology":

This page was step 1 of 7.

Next: Step 2: Start and Configure MariaDB Enterprise Server on Primary Server

Step 6: Install MariaDB MaxScale

Overview

This page details step 6 of the 9-step procedure "Deploy ColumnStore Shared Local Storage Topology".

This step installs MariaDB MaxScale 22.08.

ColumnStore Object Storage requires 1 or more MaxScale nodes.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Customer Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On the MaxScale node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On the MaxScale node, configure package repositories and specify MariaDB MaxScale 22.08:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install MaxScale

On the MaxScale node, install MariaDB MaxScale.

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

This page was step 6 of 9.

Next: Step 7: Start and Configure MariaDB MaxScale.

Step 1: Prepare ColumnStore Nodes

Overview

This page details step 1 of the 9-step procedure "".

This step prepares systems to host MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Step 2: Install Enterprise ColumnStore

Overview

This page details step 2 of a 5-step procedure for deploying .

This step installs MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Step 9: Import Data

Overview

This page details step 9 of the 9-step procedure "".

This step bulk imports data to Enterprise ColumnStore.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Step 1: Install MariaDB Enterprise Server

Overview

This page details step 1 of the 6-step procedure "".

This step installs MariaDB Enterprise Server.

MariaDB Enterprise Server installations support MariaDB Enterprise Cluster, powered by Galera. MariaDB Enterprise Cluster uses the Galera Enterprise 4 wsrep provider plugin.

MariaDB Enterprise Cluster requires an odd number of 3 or more nodes. Nodes must meet requirements.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Spider Storage Engine

Spider Topologies

Spider Federated

MariaDB Enterprise Spider enables reading from and writing to tables on remote Enterprise Server nodes. It uses the Spider storage engine for "virtual" Federated Spider Tables, querying Data Tables on Data Nodes (which use non-Spider engines) via a MariaDB foreign data wrapper. This solution supports transactions and is available with Enterprise Server 10.3+.

Step 5: Bulk Import of Data

Overview

This page details step 5 of a 5-step procedure for deploying .

This step bulk imports data to Enterprise ColumnStore.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

CREATE DATABASE inventory;
CREATE TABLE inventory.products (
   product_name VARCHAR(11) NOT NULL DEFAULT '',
   supplier VARCHAR(128) NOT NULL DEFAULT '',
   quantity VARCHAR(128) NOT NULL DEFAULT '',
   unit_cost VARCHAR(128) NOT NULL DEFAULT ''
) ENGINE=Columnstore DEFAULT CHARSET=utf8;
$ sudo cpimport -s '\t' inventory products /tmp/inventory-products.tsv
LOAD DATA INFILE '/tmp/inventory-products.tsv'
INTO TABLE inventory.products;
$ mariadb --quick \
   --skip-column-names \
   --execute="SELECT * FROM inventory.products" \
   | cpimport -s '\t' inventory products
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup

$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -

$ chmod +x mariadb_es_repo_setup

$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-server \
      --skip-tools \
      --mariadb-maxscale-version="22.08"
$ sudo yum install maxscale
$ sudo apt install maxscale
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -
$ chmod +x mariadb_es_repo_setup
$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-maxscale \
      --skip-tools \
      --mariadb-server-version="11.4"
$ sudo yum install jemalloc jq curl
$ sudo apt install libjemalloc1 jq curl
$ sudo apt install libjemalloc2 jq curl
$ sudo yum install MariaDB-server \
   MariaDB-backup \
   MariaDB-shared \
   MariaDB-client \
   MariaDB-columnstore-engine \
   MariaDB-columnstore-cmapi
$ sudo apt install mariadb-server \
   mariadb-backup \
   libmariadb3 \
   mariadb-client \
   mariadb-plugin-columnstore \
   mariadb-columnstore-cmapi
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ sudo zypper install curl
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup

$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -

$ chmod +x mariadb_es_repo_setup

$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-server \
      --skip-tools \
      --mariadb-maxscale-version="25.01"
$ sudo yum install maxscale
$ sudo apt install maxscale
$ sudo zypper install maxscale
Optimize Linux Kernel Parameters

MariaDB Enterprise ColumnStore performs best with Linux kernel optimizations.

On each server to host an Enterprise ColumnStore node, optimize the kernel:

  1. Set the relevant kernel parameters in a sysctl configuration file. To ensure proper change management, use an Enterprise ColumnStore-specific configuration file.

Create a /etc/sysctl.d/90-mariadb-enterprise-columnstore.conf file:

  1. Use the sysctl command to set the kernel parameters at runtime

Temporarily Configure Linux Security Modules (LSM)

The Linux Security Modules (LSM) should be temporarily disabled on each Enterprise ColumnStore node during installation.

The LSM will be configured and re-enabled later in this deployment procedure.

The steps to disable the LSM depend on the specific LSM used by the operating system.

CentOS / RHEL Stop SELinux

SELinux must be set to permissive mode before installing MariaDB Enterprise ColumnStore.

To set SELinux to permissive mode:

  1. Set SELinux to permissive mode:

  1. Set SELinux to permissive mode by setting SELINUX=permissive in /etc/selinux/config.

For example, the file will usually look like this after the change:

  1. Confirm that SELinux is in permissive mode:

SELinux will be configured and re-enabled later in this deployment procedure. This configuration is not persistent. If you restart the server before configuring and re-enabling SELinux later in the deployment procedure, you must reset the enforcement to permissive mode.

Debian / Ubuntu AppArmor

AppArmor must be disabled before installing MariaDB Enterprise ColumnStore.

  1. Disable AppArmor:

  1. Reboot the system.

  2. Confirm that no AppArmor profiles are loaded using aa-status:

AppArmor will be configured and re-enabled later in this deployment procedure.

Temporarily Configure Firewall for Installation

MariaDB Enterprise ColumnStore requires the following TCP ports:

TCP Ports
Description

3306

Port used for MariaDB Client traffic

8600-8630

Port range used for inter-node communication

8640

Port used by CMAPI

8700

Port used for inter-node communication

8800

Port used for inter-node communication

The firewall should be temporarily disabled on each Enterprise ColumnStore node during installation.

The firewall will be configured and re-enabled later in this deployment procedure.

The steps to disable the firewall depend on the specific firewall used by the operating system.

CentOS / RHEL Stop firewalld

  1. Check if the firewalld service is running:

  1. If the firewalld service is running, stop it:

Firewalld will be configured and re-enabled later in this deployment procedure.

Ubuntu Stop UFW

  1. Check if the UFW service is running:

  1. If the UFW service is running, stop it:

UFW will be configured and re-enabled later in this deployment procedure.

Configure the AWS Security Group

To install Enterprise ColumnStore on Amazon Web Services (AWS), the security group must be modified prior to installation.

Enterprise ColumnStore requires all internal communications to be open between Enterprise ColumnStore nodes. Therefore, the security group should allow all protocols and all ports to be open between the Enterprise ColumnStore nodes and the MaxScale proxy.

Configure Character Encoding

When using MariaDB Enterprise ColumnStore, it is recommended to set the system's locale to UTF-8.

  1. On RHEL 8, install additional dependencies:

  1. Set the system's locale to en_US.UTF-8 by executing localedef:

Configure DNS

MariaDB Enterprise ColumnStore requires all nodes to have host names that are resolvable on all other nodes. If your infrastructure does not configure DNS centrally, you may need to configure static DNS entries in the /etc/hosts file of each server.

On each Enterprise ColumnStore node, edit the /etc/hosts file to map host names to the IP address of each Enterprise ColumnStore node:

Replace the IP addresses with the addresses in your own environment.

Create an S3 Bucket

With the ColumnStore Object Storage topology, it is important to create the S3 bucket before you start ColumnStore. All Enterprise ColumnStore nodes access data from the same bucket.

If you already have an S3 bucket, confirm that the bucket is empty.

S3 bucket configuration will be performed later in this procedure.

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 1 of 9.

Next: Step 2: Configure Shared Local Storage.

Deploy ColumnStore Object Storage Topology
Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to https://customers.mariadb.com/downloads/token/

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the Versions section at the bottom of the MariaDB Package Repository Setup and Usage page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise ColumnStore

Install additional dependencies:

Install on CentOS / RHEL (YUM)

Install of Debian 10 and Ubuntu 20.04 (APT):

Install on Debian 9 and Ubuntu 18.04 (APT):

Install MariaDB Enterprise Server and MariaDB Enterprise ColumnStore:

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the Single-Node Enterprise ColumnStore topology with Local storage deployment procedure:

This page was step 2 of 5.

Next: Step 3: Start and Configure MariaDB Enterprise ColumnStore.

Single-Node Enterprise ColumnStore with Local storage
Import the Schema

Before data can be imported into the tables, create a matching schema.

On the primary server, create the schema:

  1. For each database that you are importing, create the database with the CREATE DATABASE statement:

  1. For each table that you are importing, create the table with the CREATE TABLE statement:

Import the Data

Enterprise ColumnStore supports multiple methods to import data into ColumnStore tables.

Interface
Method
Benefits

Shell

  • SQL access is not required

SQL

  • Shell access is not required

Remote Database

  • Use normal database client

  • Avoid dumping data to intermediate filed

cpimport

MariaDB Enterprise ColumnStore includes cpimport, which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server run cpimport:

LOAD DATA INFILE

When data is loaded with the LOAD DATA INFILE statement, MariaDB Enterprise ColumnStore loads the data using cpimport, which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server use LOAD DATA INFILE statement:

Import from Remote Database

MariaDB Enterprise ColumnStore can also import data directly from a remote database. A simple method is to query the table using the SELECT statement, and then pipe the results into cpimport, which is a command-line utility that is designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a remote MariaDB database:

Next Step

Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

This page was step 9 of 9.

This procedure is complete.

Deploy ColumnStore Shared Local Storage Topology
Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to https://customers.mariadb.com/downloads/token/.

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the Versions section at the bottom of the MariaDB Package Repository Setup and Usage page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise Server

  1. On each Enterprise Cluster node, install MariaDB Enterprise Server and MariaDB Enterprise Backup.

Install via CentOS / RHEL (YUM):

Install via Debian / Ubuntu (APT):

Install via SLES (ZYpp):

Next Step

Navigation in the procedure "Deploy Galera Cluster Topology":

This page was step 1 of 6.

Next: Step 2: Start and Configure MariaDB Enterprise Server

Deploy Galera Cluster Topology

  • Read from and write to tables on remote ES nodes

  • Spider Node uses Spider storage engine for Federated Spider Tables

  • Federated Spider Table is a "virtual" table

  • Spider uses MariaDB foreign data wrapper to query Data Table on Data Node

Spider Sharded

MariaDB Enterprise Spider facilitates horizontal scalability by sharding tables. It uses the Spider storage engine for partitioned "virtual" Sharded Spider Tables, querying Data Tables on Data Nodes (using non-Spider engines) for each partition via a MariaDB foreign data wrapper. This solution supports transactions and is available with Enterprise Server 10.3+.

  • Shard tables for horizontal scalability

  • Spider Node uses Spider storage engine for Sharded Spider Tables

  • Sharded Spider Table is a partitioned "virtual" table

  • Spider uses MariaDB foreign data wrapper to query Data Tables on Data Nodes for each partition

Import the Schema

Before data can be imported into the tables, create a matching schema.

On the primary server, create the schema:

  1. For each database that you are importing, create the database with the CREATE DATABASE statement:

  1. For each table that you are importing, create the table with the CREATE TABLE statement:

Import the Data

Enterprise ColumnStore supports multiple methods to import data into ColumnStore tables.

cpimport

MariaDB Enterprise ColumnStore includes cpimport, which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server run cpimport:

LOAD DATA INFILE

When data is loaded with the LOAD DATA INFILE statement, MariaDB Enterprise ColumnStore loads the data using cpimport, which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server use LOAD DATA INFILE statement:

Import from Remote Database

MariaDB Enterprise ColumnStore can also import data directly from a remote database. A simple method is to query the table using the SELECT statement, and then pipe the results into cpimport, which is a command-line utility that is designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a remote MariaDB database:

Next Step

Navigation in the Single-Node Enterprise ColumnStore topology with Object storage deployment procedure:

This page was step 5 of 5.

This procedure is complete.

Single-Node Enterprise ColumnStore with Object storage
https://customers.mariadb.com/downloads/token/
Versions
MariaDB Package Repository Setup and Usage

MariaDB Replication

  • Highly available

  • Asynchronous or semi-synchronous replication

  • Automatic failover via MaxScale

  • Manual provisioning of new nodes from backup

  • Scales reads via MaxScale

  • Enterprise Server 10.3+, MaxScale 2.5+

Galera Cluster Topology Multi-Primary Cluster Powered by Galera for Transactional/OLTP Workloads

  • InnoDB Storage Engine

  • Highly available

  • Virtually synchronous, certification-based replication

  • Automated provisioning of new nodes (IST/SST)

  • Scales reads via MaxScale Enterprise Server 10.3+, MariaDB Enterprise Cluster (powered by Galera), MaxScale 2.5+

Columnar storage engine with S3-compatible object storage

  • Highly available

  • Automatic failover via MaxScale and CMAPI

  • Scales reads via MaxScale

  • Bulk data import

  • Enterprise Server 10.5, Enterprise ColumnStore 5, MaxScale 2.5

  • Enterprise Server 10.6, Enterprise ColumnStore 23.02, MaxScale 22.08

Columnar storage engine with shared local storage

  • Highly available

  • Automatic failover via MaxScale and CMAPI

  • Scales reads via MaxScale

  • Bulk data import

  • Enterprise Server 10.5, Enterprise ColumnStore 5, MaxScale 2.5

  • Enterprise Server 10.6, Enterprise ColumnStore 23.02, MaxScale 22.08

  • Single-stack hybrid transactional/analytical workloads

  • ColumnStore for analytics with scalable S3-compatible object storage

  • InnoDB for transactions• Cross-engine JOINs

  • Enterprise Server 10.5, Enterprise ColumnStore 5, MaxScale 2.5

  • Enterprise Server 10.6, Enterprise ColumnStore 23.02, MaxScale 22.08

  • Read from and write to tables on remote ES nodes

  • Spider Node uses Spider storage engine for Federated Spider Tables

  • Federated Spider Table is a "virtual" table• Spider uses MariaDB foreign data wrapper to query Data Table on Data Node

  • Data Node uses non-Spider storage engine for Data Tables

  • Supports transactions

  • Enterprise Server 10.3+, Enterprise Spider

  • Shard tables for horizontal scalability

  • Spider Node uses Spider storage engine for Sharded Spider Tables

  • Sharded Spider Table is a partitioned "virtual" table

  • Spider uses MariaDB foreign data wrapper to query Data Tables on Data Nodes for each partition

  • Data Node uses non-Spider storage engine for Data Tables

  • Supports transactions

  • Enterprise Server 10.3+, Enterprise Spider

Deploy Single Node Topologies
https://customers.mariadb.com/downloads/token/
Versions
MariaDB Package Repository Setup and Usage
Versions
MariaDB Package Repository Setup and Usage
cpimport
LOAD DATA INFILE
Remote Database Import

Step 5: Test MariaDB Enterprise Server

Overview

This page details step 5 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step tests MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Test S3 Connection

MariaDB Enterprise ColumnStore 23.10 includes a testS3Connection command to test the S3 configuration, permissions, and connectivity.

This action is performed on each Enterprise ColumnStore node.

Test the S3 configuration by executing the following:

If the testS3Connection command does not return OK, investigate the S3 configuration.

Test Enterprise Server Service

Use Systemd to test whether the MariaDB Enterprise Server service is running.

This action is performed on each Enterprise ColumnStore node.

Check if the MariaDB Enterprise Server service is running by executing the following:

If the service is not running on any node, start the service by executing the following on that node:

Test Local Client Connections

Use to test the local connection to the Enterprise Server node.

This action is performed on each Enterprise ColumnStore node:

The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

Test ColumnStore Storage Engine Plugin

Query the table to confirm that the ColumnStore storage engine is loaded.

This action is performed on each Enterprise ColumnStore node.

Execute the following query:

The PLUGIN_STATUS column for each ColumnStore-related plugin should contain ACTIVE.

Test CMAPI Service

Use Systemd to test whether the CMAPI service is running.

This action is performed on each Enterprise ColumnStore node.

Check if the CMAPI service is running by executing the following:

If the service is not running on any node, start the service by executing the following on that node:

Test ColumnStore Status

Use CMAPI to request the ColumnStore status. The API key needs to be provided as part of the X-API-key HTML header.

This action is performed with the CMAPI service on the primary server.

Check the ColumnStore status using curl by executing the following:

Test DDL

Use MariaDB Client to test DDL.

  1. On the primary server, use the MariaDB Client to connect to the node:

  1. Create a test database and ColumnStore table:

  1. On each replica server, use the MariaDB Client to connect to the node:

  1. Confirm that the database and table exist:

If the database or table do not exist on any node, then check the replication configuration.

Test DML

Use MariaDB Client to test DML.

  1. On the primary server, use the MariaDB Client to connect to the node:

  1. Insert sample data into the table created in the DDL test:

  1. On each replica server, use the MariaDB Client to connect to the node:

  1. Execute a query to retrieve the data:

If the data is not returned on any node, check the ColumnStore status and the storage configuration.

Next Step

Navigation in the procedure 'Deploy ColumnStore Object Storage Topology".

This page was step 5 of 9.

Next: Step 6: Install MariaDB MaxScale.

This page is: Copyright © 2025 MariaDB. All rights reserved.

Step 5: Test MariaDB Enterprise Server

Overview

This page details step 5 of the 9-step procedure "Deploy ColumnStore Shared Local Storage Topology".

This step tests MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Test Enterprise Server Service

Use Systemd to test whether the MariaDB Enterprise Server service is running.

This action is performed on each Enterprise ColumnStore node.

Check if the MariaDB Enterprise Server service is running by executing the following:

If the service is not running on any node, start the service by executing the following on that node:

Test Local Client Connections

Use to test the local connection to the Enterprise Server node.

This action is performed on each Enterprise ColumnStore node:

The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

Test ColumnStore Storage Engine Plugin

Query the table to confirm that the ColumnStore storage engine is loaded.

This action is performed on each Enterprise ColumnStore node.

Execute the following query:

The PLUGIN_STATUS column for each ColumnStore-related plugin should contain ACTIVE.

Test CMAPI Service

Use Systemd to test whether the CMAPI service is running.

This action is performed on each Enterprise ColumnStore node.

Check if the CMAPI service is running by executing the following:

If the service is not running on any node, start the service by executing the following on that node:

Test ColumnStore Status

Use CMAPI to request the ColumnStore status. The API key needs to be provided as part of the X-API-key HTML header.

This action is performed with the CMAPI service on the primary server.

Check the ColumnStore status using curl by executing the following:

Test DDL

Use MariaDB Client to test DDL.

  1. On the primary server, use the MariaDB Client to connect to the node:

  1. Create a test database and ColumnStore table:

  1. On each replica server, use the MariaDB Client to connect to the node:

  1. Confirm that the database and table exist:

If the database or table do not exist on any node, then check the replication configuration.

Test DML

Use MariaDB Client to test DML.

  1. On the primary server, use the MariaDB Client to connect to the node:

  1. Insert sample data into the table created in the DDL test:

  1. On each replica server, use the MariaDB Client to connect to the node:

  1. Execute a query to retrieve the data:

If the data is not returned on any node, check the ColumnStore status and the storage configuration.

Next Step

Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

This page was step 5 of 9.

Next: Step 6: Install MariaDB MaxScale.

Step 7: Start and Configure MariaDB MaxScale

Overview

This page details step 7 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step starts and configures MariaDB MaxScale 22.08.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Replace the Default Configuration File

MariaDB MaxScale installations include a configuration file with some example objects. This configuration file should be replaced.

On the MaxScale node, replace the default /etc/maxscale.cnf with the following configuration:

For additional information, see "Global Parameters".

Restart MaxScale

On the MaxScale node, restart the MaxScale service to ensure that MaxScale picks up the new configuration:

For additional information, see "Start and Stop Services".

Configure Server Objects

On the MaxScale node, use to create a server object for each Enterprise ColumnStore node:

Configure MariaDB Monitor

MaxScale uses monitors to retrieve additional information from the servers. This information is used by other services in filtering and routing connections based on the current state of the node. For MariaDB Enterprise ColumnStore, use the MariaDB Monitor (mariadbmon).

On the MaxScale node, use to create a MariaDB Monitor:

In this example:

  • columnstore_monitor is an arbitrary name that is used to identify the new monitor.

  • mariadbmon is the name of the module that implements the MariaDB Monitor.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to monitor the ColumnStore nodes.

Choose a MaxScale Router

Routers control how MaxScale balances the load between Enterprise ColumnStore nodes. Each router uses a different approach to routing queries. Consider the specific use case of your application and database load and select the router that best suits your needs.

Router
Configuration Procedure
Description

Configure Read Connection Router

Use to route connections to replica servers for a read-only pool.

On the MaxScale node, use to create a router:

In this example:

  • connection_router_service is an arbitrary name that is used to identify the new service.

  • readconnroute is the name of the module that implements the Read Connection Router.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ColumnStore nodes.

Configure Listener for the Read Connection Router

These instructions reference TCP port 3308. You can use a different TCP port. The TCP port used must not be bound by any other listener.

On the MaxScale node, use the command to configure MaxScale to use a listener for the :

In this example:

  • connection_router_service is the name of the readconnroute service that was previously created.

  • connection_router_listener is an arbitrary name that is used to identify the new listener.

  • 3308 is the TCP port.

Configure Read/Write Split Router for Queries

MaxScale performs query-based load balancing. The router routes write queries to the primary and read queries to the replicas.

On the MaxScale node, use the maxctrl create service command to configure MaxScale to use the :

In this example:

  • query_router_service is an arbitrary name that is used to identify the new service.

  • readwritesplit is the name of the module that implements the Read/Write Split Router.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ColumnStore nodes.

Configure a Listener for the Read/Write Split Router

These instructions reference TCP port 3307. You can use a different TCP port. The TCP port used must not be bound by any other listener.

On the MaxScale node, use the command to configure MaxScale to use a listener for the :

In this example:

  • query_router_service is the name of the readwritesplit service that was previously created.

  • query_router_listener is an arbitrary name that is used to identify the new listener.

  • 3307 is the TCP port.

  • protocol=MariaDBClient

Start Services

To start the services and monitors, on the MaxScale node use :

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 7 of 9.

Next: Step 8: Test MariaDB MaxScale

This page is: Copyright © 2025 MariaDB. All rights reserved.

Step 2: Configure Shared Local Storage

Overview

This page details step 2 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

This step configures shared local storage on systems hosting Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Directories for Shared Local Storage

In a ColumnStore Object Storage topology, MariaDB Enterprise ColumnStore requires the Storage Manager directory to be located on shared local storage.

The Storage Manager directory is at the following path:

  • /var/lib/columnstore/storagemanager

The Storage Manager directory must be mounted on every ColumnStore node.

Choose a Shared Local Storage Solution

Select a Shared Local Storage solution for the Storage Manager directory:

For additional information, see "".

Configure EBS Multi-Attach

EBS is a high-performance block-storage service for AWS (Amazon Web Services). EBS Multi-Attach allows an EBS volume to be attached to multiple instances in AWS. Only clustered file systems, such as GFS2, are supported.

For Enterprise ColumnStore deployments in AWS:

  • EBS Multi-Attach is a recommended option for the Storage Manager directory.

  • Amazon S3 storage is the recommended option for data.

  • Consult the vendor documentation for details on how to configure EBS Multi-Attach.

Configure Elastic File System (EFS)

EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services)

For deployments in AWS:

  • EFS is a recommended option for the Storage Manager directory.

  • Amazon S3 storage is the recommended option for data.

  • Consult the vendor documentation for details on how to configure EFS.

Configure Filestore

Filestore is high-performance, fully managed storage for GCP (Google Cloud Platform).

For Enterprise ColumnStore deployments in GCP:

  • Filestore is the recommended option for the Storage Manager directory.

  • Google Object Storage (S3-compatible) is the recommended option for data.

  • Consult the vendor documentation for details on how to configure Filestore.

Configure GlusterFS

GlusterFS is a distributed file system.

GlusterFS is a shared local storage option, but it is not one of the recommended options.

For more information, see "".

Install GlusterFS

On each Enterprise ColumnStore node, install GlusterFS.

Install on CentOS / RHEL 8 (YUM):

Install on CentOS / RHEL 7 (YUM):

Install on Debian (APT):

Install on Ubuntu (APT):

Start the GlusterFS Daemon

Start the GlusterFS daemon:

Probe the GlusterFS Peers

Before you can create a volume with GlusterFS, you must probe each node from a peer node.

  1. On the primary node, probe all of the other cluster nodes:

  1. On one of the replica nodes, probe the primary node to confirm that it is connected:

  1. On the primary node, check the peer status:

Configure and Mount GlusterFS Volumes

Create the GlusterFS volumes for MariaDB Enterprise ColumnStore. Each volume must have the same number of replicas as the number of Enterprise ColumnStore nodes.

  1. On each Enterprise ColumnStore node, create the directory for each brick in the /brick directory:

  1. On the primary node, create the GlusterFS volumes:

  1. On the primary node, start the volume:

  1. On each Enterprise ColumnStore node, create mount points for the volumes:

  1. On each Enterprise ColumnStore node, add the mount points to /etc/fstab:

  1. On each Enterprise ColumnStore node, mount the volumes:

Configure Network File System (NFS)

NFS is a distributed file system. NFS is available in most Linux distributions. If NFS is used for an Enterprise ColumnStore deployment, the storage must be mounted with the sync option to ensure that each node flushes its changes immediately.

For on-premises deployments:

  • NFS is the recommended option for the Storage Manager directory.

  • Any S3-compatible storage is the recommended option for data.

Consult the documentation for your NFS implementation for details on how to configure NFS.

Next Step

Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

This page was step 2 of 9.

Next: Step 3: Install MariaDB Enterprise Server.

This page is: Copyright © 2025 MariaDB. All rights reserved.

Step 2: Install MariaDB Enterprise Server

Overview

This page details step 2 of the 4-step procedure "Deploy HTAP Topology".

This step installs MariaDB Enterprise Server MariaDB Enterprise ColumnStore 23.10, and dependencies.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise Server and Enterprise ColumnStore

  1. On each Enterprise ColumnStore node, install additional dependencies: Install on CentOS / RHEL (YUM)

Install of Debian 10 and Ubuntu 20.04 (APT):

Install on Debian 9 and Ubuntu 18.04 (APT):

  1. On the Enterprise ColumnStore node, install MariaDB Enterprise Server and MariaDB Enterprise ColumnStore:

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the procedure "Deploy HTAP Topology".

This page was step 2 of 4.

Next: Step 3: Start and Configure MariaDB Enterprise Server.

Step 2: Configure Shared Local Storage

Overview

This page details step 2 of the 9-step procedure "Deploy ColumnStore Shared Local Storage Topology".

This step configures shared local storage on systems hosting Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Directories for Shared Local Storage

In a ColumnStore Object Storage topology, MariaDB Enterprise ColumnStore requires the Storage Manager directory to be located on shared local storage.

The Storage Manager directory is at the following path:

  • /var/lib/columnstore/storagemanager

The N in dataN represents a range of integers that starts at 1 and stops at the number of nodes in the deployment. For example, with a 3-node Enterprise ColumnStore deployment, this would refer to the following directories:

  • /var/lib/columnstore/data1

  • /var/lib/columnstore/data2

  • /var/lib/columnstore/data3

The DB Root directories must be mounted on every ColumnStore node.

Choose a Shared Local Storage Solution

Select a Shared Local Storage solution for the Storage Manager directory:

  • EBS (Elastic Block Store) Multi-Attach

  • EFS (Elastic File System)

  • Filestore

  • GlusterFS

For additional information, see "Shared Local Storage Options".

Configure EBS Multi-Attach

EBS is a high-performance block-storage service for AWS (Amazon Web Services). EBS Multi-Attach allows an EBS volume to be attached to multiple instances in AWS. Only clustered file systems, such as GFS2, are supported.

For Enterprise ColumnStore deployments in AWS:

  • EBS Multi-Attach is a recommended option for the Storage Manager directory.

  • Amazon S3 storage is the recommended option for data.

  • Consult the vendor documentation for details on how to configure EBS Multi-Attach.

Configure Elastic File System (EFS)

EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services)

For deployments in AWS:

  • EFS is a recommended option for the Storage Manager directory.

  • Amazon S3 storage is the recommended option for data.

  • Consult the vendor documentation for details on how to configure EFS.

Configure Filestore

Filestore is high-performance, fully managed storage for GCP (Google Cloud Platform).

For Enterprise ColumnStore deployments in GCP:

  • Filestore is the recommended option for the Storage Manager directory.

  • Google Object Storage (S3-compatible) is the recommended option for data.

  • Consult the vendor documentation for details on how to configure Filestore.

Configure GlusterFS

GlusterFS is a distributed file system.

GlusterFS is a shared local storage option, but it is not one of the recommended options.

For more information, see "".

Install GlusterFS

On each Enterprise ColumnStore node, install GlusterFS.

Install on CentOS / RHEL 8 (YUM):

Install on CentOS / RHEL 7 (YUM):

Install on Debian (APT):

Install on Ubuntu (APT):

Start the GlusterFS Daemon

Start the GlusterFS daemon:

Probe the GlusterFS Peers

Before you can create a volume with GlusterFS, you must probe each node from a peer node.

  1. On the primary node, probe all of the other cluster nodes:

  1. On one of the replica nodes, probe the primary node to confirm that it is connected:

  1. On the primary node, check the peer status:

Number of Peers: 2

Configure and Mount GlusterFS Volumes

Create the GlusterFS volumes for MariaDB Enterprise ColumnStore. Each volume must have the same number of replicas as the number of Enterprise ColumnStore nodes.

  1. On each Enterprise ColumnStore node, create the directory for each brick in the /brick directory:

  1. On the primary node, create the GlusterFS volumes:

  1. On the primary node, start the volume:

  1. On each Enterprise ColumnStore node, create mount points for the volumes:

  1. On each Enterprise ColumnStore node, add the mount points to /etc/fstab:

  1. On each Enterprise ColumnStore node, mount the volumes:

Configure Network File System (NFS)

NFS is a distributed file system. NFS is available in most Linux distributions. If NFS is used for an Enterprise ColumnStore deployment, the storage must be mounted with the sync option to ensure that each node flushes its changes immediately.

For on-premises deployments:

  • NFS is the recommended option for the Storage Manager directory.

  • Any S3-compatible storage is the recommended option for data.

Consult the documentation for your NFS implementation for details on how to configure NFS.

Next Step

Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

This page was step 2 of 9.

Next: Step 3: Install MariaDB Enterprise Server.

Step 6: Start and Configure MariaDB MaxScale

Overview

This page details step 6 of the 7-step procedure "Deploy Primary/Replica Topology".

This step starts and configures MariaDB MaxScale.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Replace the Default Configuration File

MariaDB MaxScale installations include a configuration file with some example objects. This configuration file should be replaced.

On the MaxScale node, replace the default /etc/maxscale.cnf with the following configuration:

For additional information, see "".

Restart MaxScale

On the MaxScale node, restart the MaxScale service to ensure that MaxScale picks up the new configuration:

For additional information, see "".

Configure Server Objects

On the MaxScale node, use server to create a server object for each MariaDB Enterprise Server:

Configure MariaDB Monitor

MaxScale uses monitors to retrieve additional information from the servers. This information is used by other services in filtering and routing connections based on the current state of the node. For MariaDB Replication, use the MariaDB Monitor (mariadbmon).

On the MaxScale node, use to create a MariaDB Monitor:

In this example:

  • mdb_monitor is an arbitrary name that is used to identify the new monitor.

  • mariadbmon is the name of the module that implements the MariaDB Monitor.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to monitor the ES nodes.

Choose a MaxScale Router

Routers control how MaxScale balances the load between Enterprise Server nodes. Each router uses a different approach to routing queries. Consider the specific use case of your application and database load and select the router that best suits

Router
Configuration Procedure
Description

Configure Read Connection Router

Use MaxScale Read Connection Router (readconnroute) to route connections to replica servers for a read-only pool.

On the MaxScale node, use maxctrl create service to create a router:

In this example:

  • connection_router_service is an arbitrary name that is used to identify the new service.

  • readconnroute is the name of the module that implements the Read Connection Router.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ES nodes.

Configure Listener for the Read Connection Router

These instructions reference TCP port 3308. You can use a different TCP port. The TCP port used must not be bound by any other listener.

On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read Connection Router (readconnroute):

In this example:

  • connection_router_service is the name of the readconnroute service that was previously created.

  • connection_router_listener is an arbitrary name that is used to identify the new listener.

  • 3308 is the TCP port.

Configure Read/Write Split Router for Queries

MaxScale Read/Write Split Router (readwritesplit) performs query-based load balancing. The router routes write queries to the primary and read queries to the replicas.

On the MaxScale node, use the maxctrl create service command to configure MaxScale to use the Read/Write Split Router (readwritesplit):

In this example:

  • query_router_service is an arbitrary name that is used to identify the new service.

  • readwritesplit is the name of the module that implements the Read/Write Split Router.

  • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ES nodes.

Configure a Listener for the Read/Write Split Router

These instructions reference TCP port 3307. You can use a different TCP port. The TCP port used must not be bound by any other listener.

On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read/Write Split Router (readwritesplit):

In this example:

  • query_router_service is the name of the readwritesplit service that was previously created.

  • query_router_listener is an arbitrary name that is used to identify the new listener.

  • 3307 is the TCP port.

Start Services

To start the services and monitors, on the MaxScale node use maxctrl start services:

Next Step

Navigation in the procedure "Deploy Primary/Replica Topology":

This page was step 6 of 7.

Next: Step 7: Test MariaDB MaxScale

Step 4: Install MariaDB MaxScale

Overview

This page details step 4 of the 6-step procedure "Deploy Galera Cluster Topology".

This step installs MariaDB MaxScale.

MariaDB Enterprise Cluster requires 1 or more MaxScale nodes.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Customer Download Token

MariaDB Corporation provides package repositories for YUM (RHEL / CentOS), APT (Debian / Ubuntu), and ZYpp (SLES). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On the MaxScale node, install the prerequisites for downloading the software from the Web.

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Install on SLES (ZYpp):

  1. On the MaxScale node, configure package repositories and specify MariaDB MaxScale 25.01:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install MaxScale

  1. On the MaxScale node, install MariaDB MaxScale.

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Install on SLES (ZYpp):

Next Step

Navigation in the procedure "Deploy Galera Cluster Topology":

This page was step 4 of 6.

Next: Step 5: Start and Configure MariaDB MaxScale

Step 5: Bulk Import of Data

Overview

This page details step 5 of a 5-step procedure for deploying Single-Node Enterprise ColumnStore with Local storage.

This step bulk imports data to Enterprise ColumnStore.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Import the Schema

Before data can be imported into the tables, create a matching schema.

On the primary server, create the schema:

  1. For each database that you are importing, create the database with the statement:

  1. For each table that you are importing, create the table with the statement:

Import the Data

Enterprise ColumnStore supports multiple methods to import data into ColumnStore tables.

cpimport

MariaDB Enterprise ColumnStore includes , which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server run :

LOAD DATA INFILE

When data is loaded with the statement, MariaDB Enterprise ColumnStore loads the data using , which is a command-line utility designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a TSV (tab-separated values) file, on the primary server use statement:

Import from Remote Database

MariaDB Enterprise ColumnStore can also import data directly from a remote database. A simple method is to query the table using the statement, and then pipe the results into , which is a command-line utility that is designed to efficiently load data in bulk. Alternative methods are available.

To import your data from a remote MariaDB database:

Next Step

Navigation in the Single-Node Enterprise ColumnStore topology with Local storage deployment procedure:

This page was step 5 of 5.

This procedure is complete.

Step 2: Install Enterprise ColumnStore

Overview

This page details step 2 of a 5-step procedure for deploying Single-Node Enterprise ColumnStore with Object storage.

This step installs MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Retrieve Download Token

MariaDB Corporation provides package repositories for CentOS / RHEL (YUM) and Debian / Ubuntu (APT). A download token is required to access the MariaDB Enterprise Repository.

Customer Download Tokens are customer-specific and are available through the MariaDB Customer Portal.

To retrieve the token for your account:

  1. Navigate to

  2. Log in.

  3. Copy the Customer Download Token.

Substitute your token for CUSTOMER_DOWNLOAD_TOKEN when configuring the package repositories.

Set Up Repository

  1. On each Enterprise ColumnStore node, install the prerequisites for downloading the software from the Web. Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

  1. On each Enterprise ColumnStore node, configure package repositories and specify Enterprise Server:

Checksums of the various releases of the mariadb_es_repo_setup script can be found in the section at the bottom of the page. Substitute ${checksum} in the example above with the latest checksum.

Install Enterprise ColumnStore

Install additional dependencies:

Install on CentOS / RHEL (YUM)

Install of Debian 10 and Ubuntu 20.04 (APT):

Install on Debian 9 and Ubuntu 18.04 (APT):

Install MariaDB Enterprise Server and MariaDB Enterprise ColumnStore:

Install on CentOS / RHEL (YUM):

Install on Debian / Ubuntu (APT):

Next Step

Navigation in the Single-Node Enterprise ColumnStore topology with Object storage deployment procedure:

This page was step 2 of 5.

Next: Step 3: Start and Configure MariaDB Enterprise ColumnStore.

Step 1: Prepare ColumnStore Nodes

Overview

This page details step 1 of the 9-step procedure "".

This step prepares systems to host MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Step 4: Test Enterprise ColumnStore

Overview

This page details step 4 of a 5-step procedure for deploying .

This step tests MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

Step 1: Prepare Systems for Enterprise ColumnStore Nodes

Step 1: Prepare Systems for Enterprise ColumnStore Nodes

Overview

This page details step 1 of a 5-step procedure for deploying .

Step 1: Prepare ColumnStore Node

Overview

This page details step 1 of the 4-step procedure "".

This step prepares the system to host MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

# minimize swapping
vm.swappiness = 1

# Increase the TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

# Increase the TCP buffer limits
# min, default, and max number of bytes to use
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# don't cache ssthresh from previous connection
net.ipv4.tcp_no_metrics_save = 1

# for 1 GigE, increase this to 2500
# for 10 GigE, increase this to 30000
net.core.netdev_max_backlog = 2500
$ sudo sysctl --load=/etc/sysctl.d/90-mariadb-enterprise-columnstore.conf
$ sudo setenforce permissive
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
$ sudo getenforce
Permissive
$ sudo systemctl disable apparmor
$ sudo aa-status
apparmor module is loaded.
0 profiles are loaded.
0 profiles are in enforce mode.
0 profiles are in complain mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
$ sudo systemctl status firewalld
$ sudo systemctl stop firewalld
$ sudo ufw status verbose
$ sudo ufw disable
$ sudo yum install glibc-locale-source glibc-langpack-en
$ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
192.0.2.1     mcs1
192.0.2.2     mcs2
192.0.2.3     mcs3
192.0.2.100   mxs1
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
$ echo "${checksum}  mariadb_es_repo_setup" \
      
 | sha256sum -c -
$ chmod +x mariadb_es_repo_setup
$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-maxscale \
      --skip-tools \
      --mariadb-server-version="11.4"
$ sudo yum install epel-release

$ sudo yum install jemalloc
$ sudo apt install libjemalloc2
$ sudo apt install libjemalloc1
$ sudo yum install MariaDB-server \
   MariaDB-backup \
   MariaDB-shared \
   MariaDB-client \
   MariaDB-columnstore-engine
$ sudo apt install mariadb-server \
   mariadb-backup \
   libmariadb3 \
   mariadb-client \
   mariadb-plugin-columnstore
CREATE DATABASE inventory;
CREATE TABLE inventory.products (
   product_name VARCHAR(11) NOT NULL DEFAULT '',
   supplier VARCHAR(128) NOT NULL DEFAULT '',
   quantity VARCHAR(128) NOT NULL DEFAULT '',
   unit_cost VARCHAR(128) NOT NULL DEFAULT ''
) ENGINE=Columnstore DEFAULT CHARSET=utf8;
$ sudo cpimport -s '\t' inventory products /tmp/inventory-products.tsv
LOAD DATA INFILE '/tmp/inventory-products.tsv'
INTO TABLE inventory.products;
$ mariadb --quick \
   --skip-column-names \
   --execute="SELECT * FROM inventory.products" \
   | cpimport -s '\t' inventory products
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -
$ chmod +x mariadb_es_repo_setup
$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-maxscale \
      --skip-tools \
      --mariadb-server-version="11.4"
$ sudo yum install MariaDB-server MariaDB-backup
$ sudo apt update

$ sudo apt install mariadb-server mariadb-backup
$ sudo zypper install MariaDB-server MariaDB-backup
CREATE DATABASE inventory;
CREATE TABLE inventory.products (
   product_name VARCHAR(11) NOT NULL DEFAULT '',
   supplier VARCHAR(128) NOT NULL DEFAULT '',
   quantity VARCHAR(128) NOT NULL DEFAULT '',
   unit_cost VARCHAR(128) NOT NULL DEFAULT ''
) ENGINE=Columnstore DEFAULT CHARSET=utf8;
$ sudo cpimport -s '\t' inventory products /tmp/inventory-products.tsv
LOAD DATA INFILE '/tmp/inventory-products.tsv'
INTO TABLE inventory.products;
$ mariadb --quick \
   --skip-column-names \
   --execute="SELECT * FROM inventory.products" \
   | cpimport -s '\t' inventory products
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -
$ chmod +x mariadb_es_repo_setup
$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-maxscale \
      --skip-tools \
      --mariadb-server-version="11.4"
$ sudo yum install jemalloc jq curl
$ sudo apt install libjemalloc1 jq curl
$ sudo apt install libjemalloc2 jq curl
$ sudo yum install MariaDB-server \
   MariaDB-backup \
   MariaDB-shared \
   MariaDB-client \
   MariaDB-columnstore-engine \
   MariaDB-columnstore-cmapi
$ sudo apt install mariadb-server \
   mariadb-backup \
   libmariadb3 \
   mariadb-client \
   mariadb-plugin-columnstore \
   mariadb-columnstore-cmapi
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -
$ chmod +x mariadb_es_repo_setup
$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-maxscale \
      --skip-tools \
      --mariadb-server-version="11.4"
$ sudo yum install MariaDB-server MariaDB-backup
$ sudo apt update

$ sudo apt install mariadb-server mariadb-backup
$ sudo zypper install MariaDB-server MariaDB-backup
$ sudo yum install curl
$ sudo apt install curl apt-transport-https
$ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup

$ echo "${checksum}  mariadb_es_repo_setup" \
       | sha256sum -c -

$ chmod +x mariadb_es_repo_setup

$ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
      --skip-server \
      --skip-tools \
      --mariadb-maxscale-version="22.08"
$ sudo yum install maxscale
$ sudo apt install maxscale

password='MAXSCALE_USER_PASSWORD' sets the password parameter to the password used by the database user account that MaxScale uses to monitor the ColumnStore nodes.

  • replication_user=REPLICATION_USER sets the replication_user parameter to the database user account that MaxScale uses to setup replication.

  • replication_password='REPLICATION_USER_PASSWORD' sets the replication_password parameter to the password used by the database user account that MaxScale uses to setup replication.

  • --servers sets the servers parameter to the set of nodes that MaxScale should monitor. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by mariadbmon in MaxScale 22.08 can also be specified.

  • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ColumnStore nodes.
  • router_options=slave sets the router_options parameter to slave, so that MaxScale only routes connections to the replica nodes.

  • --servers sets the servers parameter to the set of nodes to which MaxScale should route connections. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by readconnroute in MaxScale 22.08 can also be specified.

  • protocol=MariaDBClient sets the protocol parameter.
  • Other Module Parameters supported by listeners in MaxScale 22.08 can also be specified.

  • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ColumnStore nodes.

  • --servers sets the servers parameter to the set of nodes to which MaxScale should route queries. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by readwritesplit in MaxScale 22.08 can also be specified.

  • sets the protocol parameter.
  • Other Module Parameters supported by listeners in MaxScale 22.08 can also be specified.

  • Read Connection (readconnroute)

    Configure Read Connection Router

    Connection-based load balancing

    • Routes connections to Enterprise ColumnStore nodes designated as replica servers for a read-only pool

    • Routes connections to an Enterprise ColumnStore node designated as the primary server for a read-write pool.|

    Read/Write Split (readwritesplit)

    Configure Read/Write Split

    Query-based load balancing

    • Routes write queries to an Enterprise ColumnStore node designated as the primary server

    • Routes read queries to Enterprise ColumnStore node designated as replica servers

    • Automatically reconnects after node failures

    • Automatically replays transactions after node failures

    • Optionally enforces causal reads|

    maxctrl create
    maxctrl create monitor
    MaxScale Read Connection Router (readconnroute)
    maxctrl create service
    maxctrl create listener
    Read Connection Router (readconnroute)
    Read/Write Split Router (readwritesplit)
    Read/Write Split Router (readwritesplit)
    maxctrl create listener
    Read/Write Split Router (readwritesplit)
    maxctrl start services
    NFS (Network File System)
    EBS (Elastic Block Store) Multi-Attach
    EFS (Elastic File System)
    Filestore
    GlusterFS
    Shared Local Storage Options
    NFS (Network File System)

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    password='MAXSCALE_USER_PASSWORD' sets the password parameter to the password used by the database user account that MaxScale uses to monitor the ES nodes.

  • replication_user=REPLICATION_USER sets the replication_user parameter to the database user account that MaxScale uses to setup replication.

  • replication_password='REPLICATION_USER_PASSWORD' sets the replication_password parameter to the password used by the database user account that MaxScale uses to setup replication.

  • --servers sets the servers parameter to the set of nodes that MaxScale should monitor. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by mariadbmon in MaxScale can also be specified.

  • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ES nodes.

  • router_options=slave sets the router_options parameter to slave, so that MaxScale only routes connections to the replica nodes.

  • --servers sets the servers parameter to the set of nodes to which MaxScale should route connections. All non-option arguments after --serversare interpreted as server names.

  • Other Module Parameters supported by readconnroute in MaxScale 25.01 can also be specified.

  • protocol=MariaDBClient sets the protocol parameter.
  • Other Module Parameters supported by listeners in MaxScale can also be specified.

  • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ES nodes.

  • --servers sets the servers parameter to the set of nodes to which MaxScale should route queries. All non-option arguments after --servers are interpreted as server names.

  • Other Module Parameters supported by readwritesplit in MaxScale can also be specified.

  • protocol=MariaDBClient sets the protocol parameter.
  • Other Module Parameters supported by listeners in MaxScale can also be specified.

  • Read Connection (readconnroute)

    Configure Read Connection Router

    Connection-based load balancing

    • Routes connections to Enterprise ColumnStore nodes designated as replica servers for a read-only pool

    • Routes connections to an Enterprise ColumnStore node designated as the primary server for a read-write pool.

    Read/Write Split (readwritesplit)

    Configure Read/Write Split

    Query-based load balancing

    • Routes write queries to an Enterprise ColumnStore node designated as the primary server

    • Routes read queries to Enterprise ColumnStore node designated as replica servers

    • Automatically reconnects after node failures

    • Automatically replays transactions after node failures

    • Optionally enforces causal reads

    Starting and Stopping MariaDB
    maxctrl create
    maxctrl create monitor

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Data Node uses non-Spider storage engine for Data Tables

  • Supports transactions

  • Enterprise Server 10.3+, Enterprise Spider

  • Data Node uses non-Spider storage engine for Data Tables

  • Supports transactions

  • Enterprise Server 10.3+, Enterprise Spider

  • Spider Federated Topology
    Spider Sharded Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Optimize Linux Kernel Parameters

    MariaDB Enterprise ColumnStore performs best with Linux kernel optimizations.

    On each server to host an Enterprise ColumnStore node, optimize the kernel:

    1. Set the relevant kernel parameters in a sysctl configuration file. To ensure proper change management, use an Enterprise ColumnStore-specific configuration file. Create a /etc/sysctl.d/90-mariadb-enterprise-columnstore.conf file:

    1. Use the sysctl command to set the kernel parameters at runtime

    Temporarily Configure Linux Security Modules (LSM)

    The Linux Security Modules (LSM) should be temporarily disabled on each Enterprise ColumnStore node during installation.

    The LSM will be configured and re-enabled later in this deployment procedure.

    The steps to disable the LSM depend on the specific LSM used by the operating system.

    CentOS / RHEL Stop SELinux

    SELinux must be set to permissive mode before installing MariaDB Enterprise ColumnStore.

    To set SELinux to permissive mode:

    1. Set SELinux to permissive mode:

    1. Set SELinux to permissive mode by setting SELINUX=permissive in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Confirm that SELinux is in permissive mode:

    SELinux will be configured and re-enabled later in this deployment procedure. This configuration is not persistent. If you restart the server before configuring and re-enabling SELinux later in the deployment procedure, you must reset the enforcement to permissive mode.

    Debian / Ubuntu AppArmor

    AppArmor must be disabled before installing MariaDB Enterprise ColumnStore.

    1. Disable AppArmor:

    1. Reboot the system.

    2. Confirm that no AppArmor profiles are loaded using aa-status:

    AppArmor will be configured and re-enabled later in this deployment procedure.

    Temporarily Configure Firewall for Installation

    MariaDB Enterprise ColumnStore requires the following TCP ports:

    TCP Ports
    Description

    3306

    Port used for MariaDB Client traffic

    8600-8630

    Port range used for inter-node communication

    8640

    Port used by CMAPI

    8700

    Port used for inter-node communication

    8800

    Port used for inter-node communication

    The firewall should be temporarily disabled on each Enterprise ColumnStore node during installation.

    The firewall will be configured and re-enabled later in this deployment procedure.

    The steps to disable the firewall depend on the specific firewall used by the operating system.

    CentOS / RHEL Stop firewalld

    1. Check if the firewalld service is running:

    1. If the firewalld service is running, stop it:

    Firewalld will be configured and re-enabled later in this deployment procedure.

    Ubuntu Stop UFW

    1. Check if the UFW service is running:

    1. If the UFW service is running, stop it:

    UFW will be configured and re-enabled later in this deployment procedure.

    Configure the AWS Security Group

    To install Enterprise ColumnStore on Amazon Web Services (AWS), the security group must be modified prior to installation.

    Enterprise ColumnStore requires all internal communications to be open between Enterprise ColumnStore nodes. Therefore, the security group should allow all protocols and all ports to be open between the Enterprise ColumnStore nodes and the MaxScale proxy.

    Configure Character Encoding

    When using MariaDB Enterprise ColumnStore, it is recommended to set the system's locale to UTF-8.

    1. On RHEL 8, install additional dependencies:

    1. Set the system's locale to en_US.UTF-8 by executing localedef:

    Configure DNS

    MariaDB Enterprise ColumnStore requires all nodes to have host names that are resolvable on all other nodes. If your infrastructure does not configure DNS centrally, you may need to configure static DNS entries in the /etc/hosts file of each server.

    On each Enterprise ColumnStore node, edit the /etc/hosts file to map host names to the IP address of each Enterprise ColumnStore node:

    Replace the IP addresses with the addresses in your own environment.

    Next Step

    Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

    This page was step 1 of 9.

    Deploy ColumnStore Shared Local Storage Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Test Local Connection

    Connect to the server using MariaDB Client using the root@localhost user account:

    Test ColumnStore Plugin Status

    Query information_schema.PLUGINS and confirm that the ColumnStore storage engine plugin is ACTIVE:

    Test ColumnStore Table Creation

    1. Create a test database, if it does not exist:

    1. Create a ColumnStore table:

    1. Add sample data into the table:

    1. Read data from table:

    Test Cross Engine Join

    1. Create an InnoDB table:

    1. Add data to the table:

    1. Perform a cross-engine join:

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Local storage deployment procedure:

    This page was step 4 of 5.

    Next: Step 5: Bulk Import of Data.

    Single-Node Enterprise ColumnStore with Local storage

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This step prepares the system to host MariaDB Enterprise Server and MariaDB Enterprise ColumnStore.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Optimize Linux Kernel Parameters

    MariaDB Enterprise ColumnStore performs best with Linux kernel optimizations.

    On each server to host an Enterprise ColumnStore node, optimize the kernel:

    1. Set the relevant kernel parameters in a sysctl configuration file. To ensure proper change management, use an Enterprise ColumnStore-specific configuration file.

    Create a /etc/sysctl.d/90-mariadb-enterprise-columnstore.conf file:

    1. Use the sysctl command to set the kernel parameters at runtime

    Temporarily Configure Linux Security Modules (LSM)

    The Linux Security Modules (LSM) should be temporarily disabled on each Enterprise ColumnStore node during installation.

    The LSM will be configured and re-enabled later in this deployment procedure.

    The steps to disable the LSM depend on the specific LSM used by the operating system.

    CentOS / RHEL Stop SELinux

    SELinux must be set to permissive mode before installing MariaDB Enterprise ColumnStore.

    To set SELinux to permissive mode:

    1. Set SELinux to permissive mode:

    1. Set SELinux to permissive mode by setting SELINUX=permissive in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Confirm that SELinux is in permissive mode:

    SELinux will be configured and re-enabled later in this deployment procedure. This configuration is not persistent. If you restart the server before configuring and re-enabling SELinux later in the deployment procedure, you must reset the enforcement to permissive mode.

    Debian / Ubuntu AppArmor

    AppArmor must be disabled before installing MariaDB Enterprise ColumnStore.

    1. Disable AppArmor:

    1. Reboot the system.

    2. Confirm that no AppArmor profiles are loaded using aa-status:

    AppArmor will be configured and re-enabled later in this deployment procedure.

    Configure Character Encoding

    When using MariaDB Enterprise ColumnStore, it is recommended to set the system's locale to UTF-8.

    1. On RHEL 8, install additional dependencies:

    1. Set the system's locale to en_US.UTF-8 by executing localedef:

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Local storage deployment procedure:

    This page was step 1 of 5.

    Next: Step 2: Install MariaDB Enterprise ColumnStore.

    Single-Node Enterprise ColumnStore with Local storage

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Optimize Linux Kernel Parameters

    MariaDB Enterprise ColumnStore performs best with Linux kernel optimizations.

    To optimize the kernel:

    1. Set the relevant kernel parameters in a sysctl configuration file. To ensure proper change management, use an Enterprise ColumnStore-specific configuration file.

    Create a /etc/sysctl.d/90-mariadb-enterprise-columnstore.conf file:

    1. Use the sysctl command to set the kernel parameters at runtime

    Temporarily Configure Linux Security Modules (LSM)

    The Linux Security Modules (LSM) should be temporarily disabled on each Enterprise ColumnStore node during installation.

    The LSM will be configured and re-enabled later in this deployment procedure.

    The steps to disable the LSM depend on the specific LSM used by the operating system.

    CentOS / RHEL Stop SELinux

    SELinux must be set to permissive mode before installing MariaDB Enterprise ColumnStore.

    To set SELinux to permissive mode:

    1. Set SELinux to permissive mode:

    1. Set SELinux to permissive mode by setting SELINUX=permissive in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Confirm that SELinux is in permissive mode:

    SELinux will be configured and re-enabled later in this deployment procedure. This configuration is not persistent. If you restart the server before configuring and re-enabling SELinux later in the deployment procedure, you must reset the enforcement to permissive mode.

    Debian / Ubuntu AppArmor

    AppArmor must be disabled before installing MariaDB Enterprise ColumnStore.

    1. Disable AppArmor:

    1. Reboot the system.

    2. Confirm that no AppArmor profiles are loaded using aa-status:

    AppArmor will be configured and re-enabled later in this deployment procedure.

    Configure Character Encoding

    When using MariaDB Enterprise ColumnStore, it is recommended to set the system's locale to UTF-8.

    1. On RHEL 8, install additional dependencies:

    1. Set the system's locale to en_US.UTF-8 by executing localedef:

    Create an S3 Bucket

    With the HTAP topology, it is important to create the S3 bucket before you start ColumnStore.

    If you already have an S3 bucket, confirm that the bucket is empty.

    S3 bucket configuration will be performed later in this procedure.

    Next Step

    Navigation in the procedure "Deploy HTAP Topology".

    This page was step 1 of 4.

    Next: Step 2: Install MariaDB Enterprise Server.

    Deploy HTAP Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    MariaDB Client
    information_schema.PLUGINS
    SELECT
    MariaDB Client
    information_schema.PLUGINS
    SELECT

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    https://customers.mariadb.com/downloads/token/
    Versions
    MariaDB Package Repository Setup and Usage

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Versions
    MariaDB Package Repository Setup and Usage

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    CREATE DATABASE
    CREATE TABLE
    cpimport
    cpimport
    LOAD DATA INFILE
    cpimport
    LOAD DATA INFILE
    SELECT
    cpimport

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    https://customers.mariadb.com/downloads/token/
    Versions
    MariaDB Package Repository Setup and Usage

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    cpimport
    LOAD DATA INFILE
    Remote Database Import

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Step 3: Test MariaDB Enterprise Server

    Overview

    This page details step 3 of the 6-step procedure "Deploy Galera Cluster Topology".

    This step tests MariaDB Enterprise Server.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Test Enterprise Server Service

    Use Systemd to test whether the MariaDB Enterprise Server service is running.

    This action is performed on each Enterprise Cluster node.

    Check if the MariaDB Enterprise Server service is running by executing the following:

    If the service is not running on any node, start the service by executing the following on that node:

    Test Local Client Connections

    Use to test the local connection to the Enterprise Server node.

    This action is performed on each Enterprise Cluster node:

    The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

    Test Cluster Status

    MariaDB Enterprise Cluster is operational when the cluster has a Primary Component. Query the status variable with SHOW GLOBAL STATUS to confirm that each node belongs to the Primary Component.

    This action is performed on each Enterprise Cluster node.

    Check the cluster status by executing the following:

    If the Value column does not contain Primary on any node, then the node is not part of the Primary Component. Investigate network connectivity between the node and the nodes in the Primary Component.

    Test Cluster Size

    MariaDB Enterprise Cluster maintains a count of the cluster size. Query the status variable with SHOW GLOBAL STATUS to confirm the number of nodes currently in the cluster.

    This action is performed on each Enterprise Cluster node.

    Check the cluster size by executing the following:

    If the Value column does not contain the expected number of nodes, then some nodes might not be in the cluster. Check the value of the on each node to confirm that all nodes are in the same cluster.

    Test DDL

    Use MariaDB Client to test DDL.

    1. On a single Enterprise Cluster node, use the MariaDB Client to connect to the node:

    Create a test database and InnoDB table:

    1. On each other Enterprise Cluster node, use the MariaDB Client to connect to the node:

    1. Confirm that the database and table exist:

    If the database or table do not exist on any node, then check that:

    The nodes are in the Primary Component of the same cluster.

    The wsrep_osu_method system variable is not set to RSU.

    Test DML

    Use MariaDB Client to test DML.

    1. On a single Enterprise Cluster node, use the MariaDB Client to connect to the node:

    1. Insert sample data into the table created in the DDL test:

    1. On each other Enterprise Cluster node, use the MariaDB Client to connect to the node:

    1. Execute a query to retrieve the data:

    If the data is not returned on any node, then check that:

    • The nodes are in the Primary Component of the same cluster.

    • The table uses the InnoDB storage engine.

    • The wsrep_on system variable is set to ON.

    Next Step

    Navigation in the procedure "Deploy Galera Cluster Topology":

    This page was step 3 of 6.

    Next: Step 4: Install MariaDB MaxScale

    Step 2: Start and Configure MariaDB Enterprise Server

    Overview

    This page details step 2 of the 6-step procedure "Deploy Galera Cluster Topology".

    This step configures MariaDB Enterprise Servers to operate as Enterprise Cluster nodes and starts MariaDB Enterprise Cluster.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Stop the Enterprise Server Service

    The installation process might have started the Enterprise Server service. The service should be stopped prior to making configuration changes.

    On each Enterprise Cluster node, stop the MariaDB Enterprise Server service:

    Acquire TLS Certificate

    By default, MariaDB Enterprise Cluster requires data-in-transit encryption to secure Galera replication traffic.

    MariaDB Enterprise Cluster encrypts the data using the Transport Layer Security (TLS) protocol, which is a newer version of the Secure Socket Layer (SSL) protocol.

    In MariaDB Enterprise Cluster 10.5 and earlier, TLS was supported, but not required. For backward compatibility, MariaDB Enterprise Cluster supports the Provider WSREP TLS Mode, which is equivalent to Enterprise Cluster's TLS implementation in ES 10.5 and earlier. For additional information, see "WSREP TLS Modes".

    TLS configuration requires 3 files.

    Example Filename
    Description

    Self-signed certificates are supported. However, in environments where security is critical, it is recommended to use certificates signed by a trusted Certificate Authority (CA).

    For additional information, see "Data-in-Transit Encryption".

    Configure Enterprise Cluster

    MariaDB Enterprise Server installations support MariaDB Enterprise Cluster, powered by Galera. MariaDB Enterprise Cluster uses the Galera Enterprise 4 wsrep provider plugin. The path to the wsrep provider plugin must be configured using the system variable.

    Required System Variables and Options

    Enterprise Cluster nodes require that you set the following system variables and options:

    System Variable/Option
    Description

    Example Configuration

    Edit a configuration file and set these system variables and options:

    For additional information, see "MariaDB Enterprise Server Configuration Management".

    Configure MariaDB Replication

    MariaDB Enterprise Cluster can be deployed alongside MariaDB Replication. Deploying MariaDB Enterprise Cluster with MariaDB Replication enables integrating Enterprise Cluster with other products and clusters, for example as separate clusters in different data centers, or as a small dedicated write cluster with two larger dedicated read clusters.

    For additional information, see "Replication Configuration".

    Bootstrap the Primary Component

    When an Enterprise Cluster node starts, it checks the addresses in the system variable to establish connections with other nodes. The node does not become active until it finds a node that belongs to the Primary Component.

    To start the cluster when all nodes are down, you must bootstrap the Primary Component on one node. This allows the other nodes to connect to a working cluster.

    On one Enterprise Cluster node, when all nodes are down, bootstrap the Primary Component.

    1. Bootstrap the Primary Component:

    For additional information, see "Bootstrap a Galera Cluster".

    1. Connect with MariaDB Client:

    The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

    Use the SHOW STATUS statement to check the status variable:

    The Enterprise Cluster node launches as the Primary Component of a single-node cluster.

    Add Nodes to the Cluster

    To add nodes to a cluster that has a Primary Component running, complete the following procedure for each Enterprise Cluster node to be added. Nodes should be added one at a time.

    1. On the Enterprise Cluster node being added, start MariaDB Enterprise Server:

    For additional information, see "Start and Stop Services".

    1. On the Enterprise Cluster node being added, connect with MariaDB Client:

    1. On the bootstrapped Enterprise Cluster node, use the SHOW STATUS statement to check the status variable:

    1. On the Enterprise Cluster node being added, use the SHOW STATUS statement to check the status variable. If is SYNCED, the node has been successfully added, and the Add Node procedure can be repeated to add more nodes.

    When each new Enterprise Cluster node joins the cluster, it requests the current cluster position. If the new node is missing transactions, it initiates either a State Snapshot Transfer (SST) or an Incremental State Transfer (IST) from a donor node to synchronize its data with the Primary Component. Depending on the value of , the donor node may or may not be blocked during an SST.

    When the new Enterprise Cluster node finishes its state transfer, the node updates the status variable to SYNCED. MaxScale registers the change and begins routing connections or queries to the new node.

    Next Step

    Navigation in the procedure "Deploy Galera Cluster Topology":

    This page was step 2 of 6.

    Next: Step 3: Test MariaDB Enterprise Server

    Step 3: Start and Configure Enterprise ColumnStore

    Overview

    This page details step 3 of a 5-step procedure for deploying Single-Node Enterprise ColumnStore with Local storage.

    This step starts and configures MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Configure Enterprise ColumnStore

    Mandatory system variables and options for Single-Node Enterprise ColumnStore include:

    Connector
    MariaDB Connector/R2DBC

    Example Configuration

    Start the Enterprise ColumnStore Services

    Start and enable the MariaDB Enterprise Server service, so that it starts automatically upon reboot:

    Start and enable the MariaDB Enterprise ColumnStore service, so that it starts automatically upon reboot:

    Create the Utility User

    Enterprise ColumnStore requires a mandatory utility user account. By default, it connects to the server using the root user with no password. MariaDB Enterprise Server 10.6 will reject this login attempt by default, so you will need to configure Enterprise ColumnStore to use a different user account and password and create this user account on Enterprise Server.

    1. On the Enterprise ColumnStore node, create the user account with the statement:

    1. On the Enterprise ColumnStore node, grant the user account SELECT privileges on all databases with the GRANT statement:

    1. Configure Enterprise ColumnStore to use the utility user:

    1. Set the password:

    For details about how to encrypt the password, see "".

    Passwords should meet your organization's password policies. If your MariaDB Enterprise Server instance has a password validation plugin installed, then the password should also meet the configured requirements.

    Configure Linux Security Modules (LSM)

    The specific steps to configure the security module depend on the operating system.

    Configure SELinux (CentOS, RHEL)

    Configure SELinux for Enterprise ColumnStore:

    1. To configure SELinux, you have to install the packages required for audit2allow. On CentOS 7 and RHEL 7, install the following:

    On RHEL 8, install the following:

    1. Allow the system to run under load for a while to generate SELinux audit events.

    2. After the system has taken some load, generate an SELinux policy from the audit events using audit2allow:

    If no audit events were found, this will print the following:

    1. If audit events were found, the new SELinux policy can be loaded using semodule:

    1. Set SELinux to enforcing mode by setting SELINUX=enforcing in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Set SELinux to enforcing mode:

    Configure AppArmor (Ubuntu)

    For information on how to create a profile, see on ubuntu.com.

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Local storage deployment procedure:

    This page was step 3 of 5.

    Next: Step 4: Test MariaDB Enterprise ColumnStore.

    Enterprise Server with ColumnStore (Local Storage)

    Deployment instructions for a single-node MariaDB Enterprise Server instance with the ColumnStore engine using local storage.

    This procedure describes the deployment of the Single-Node Enterprise ColumnStore topology with Local storage.

    MariaDB Enterprise ColumnStore 23.10 is a columnar storage engine for MariaDB Enterprise Server 10.6. Enterprise ColumnStore is best suited for Online Analytical Processing (OLAP) workloads.

    This procedure has 5 steps, which are executed in sequence.

    This page provides an overview of the topology, requirements, and deployment procedures.

    Please read and understand this procedure before executing.

    Procedure Steps

    Step
    Description

    Support

    Customers can obtain support by .

    Components

    The following components are deployed during this procedure:

    Component
    Function

    MariaDB Enterprise Server Components

    Component
    Description

    Topology

    The Single-Node Enterprise ColumnStore topology provides support for Online Analytical Processing (OLAP) workloads to MariaDB Enterprise Server.

    The Enterprise ColumnStore node:

    • Receives queries from the application

    • Executes queries

    • Uses the local disk for storage.

    High Availability

    Single-Node Enterprise ColumnStore does not provide high availability (HA) for Online Analytical Processing (OLAP). If you would like to deploy Enterprise ColumnStore with high availability, see .

    Requirements

    These requirements are for the Single-Node Enterprise ColumnStore, when deployed with MariaDB Enterprise Server 10.6 and MariaDB Enterprise ColumnStore 23.10.

    Operating System

    • Debian 11 (x86_64, ARM64)

    • Debian 12 (x86_64, ARM64)

    • Red Hat Enterprise Linux 8 (x86_64, ARM64)

    • Red Hat Enterprise Linux 9 (x86_64, ARM64)

    Minimum Hardware Requirements

    MariaDB Enterprise ColumnStore's minimum hardware requirements are not intended for production environments, but the minimum hardware requirements can be appropriate for development and test environments. For production environments, see the instead.

    The minimum hardware requirements are:

    Component
    CPU
    Memory

    MariaDB Enterprise ColumnStore will refuse to start if the system has less than 3 GB of memory.

    If Enterprise ColumnStore is started on a system with less memory, the following error message will be written to the ColumnStore system log called crit.log:

    And the following error message will be raised to the client:

    Recommended Hardware Requirements

    MariaDB Enterprise ColumnStore's recommended hardware requirements are intended for production analytics.

    The recommended hardware requirements are:

    Component
    CPU
    Memory

    Quick Reference

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service.

    Operation
    Command

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Local storage deployment procedure:

    • Next: Step 1: Install MariaDB Enterprise ColumnStore 23.10.

    Step 4: Test Enterprise ColumnStore

    Overview

    This page details step 4 of a 5-step procedure for deploying Single-Node Enterprise ColumnStore with Object storage.

    This step tests MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Test S3 Connection

    MariaDB Enterprise ColumnStore 23.10 includes a testS3Connection command to test the S3 configuration, permissions, and connectivity.

    On each Enterprise ColumnStore node, test the S3 configuration:

    If the testS3Connection command does not return OK, investigate the S3 configuration.

    Test Local Connection

    Connect to the server using using the root@localhost user account:

    Test ColumnStore Plugin Status

    Query and confirm that the ColumnStore storage engine plugin is ACTIVE:

    Test ColumnStore Table Creation

    1. Create a test database, if it does not exist:

    1. Create a ColumnStore table:

    1. Add sample data into the table:

    1. Read data from table:

    Test Cross Engine Join

    1. Create an InnoDB table:

    1. Add data to the table:

    1. Perform a cross-engine join:

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Object storage deployment procedure:

    This page was step 4 of 5.

    Next: Step 5: Bulk Import of Data.

    Step 2: Configure Spider Node and Data Node

    Overview

    This page details step 2 of the 3-step procedure "Deploy Spider Federated Topology".

    This step configures the Spider Node and Data Node and creates the Spider Table and Data Table.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Create Spider User

    The data node requires a user account that the Spider Node uses to connect.

    On the Data Node, create the Spider user account for the Spider Node using the statement:

    Privileges will be granted to the user account in .

    Test Spider User

    On the Spider Node, confirm that the Spider user account can connect to the Data Node using MariaDB Client:

    Configure Connection Details

    The Spider Node requires connection details for the Data Node.

    On the Spider Node, create a server object to configure the connection details for the Data Node using the statement:

    The Data Node runs MariaDB Enterprise Server, so the FOREIGN DATA WRAPPER is set to mariadb.

    Using a server object for connection details is optional. Alternatively, the connection details for the Data Node can be specified in the COMMENT table option of the statement when .

    Create the Data Table

    When queries read and write to a Spider Table, Spider reads and writes to the Data Table on the Data Node. The Data Table must be created on the Data Node with the same structure as the Spider Table.

    If your Data Table already exists, grant privileges on the table to the Spider user.

    On the Data Node, create the Data Table:

    The Spider Node reads and writes to the Data Table using the server and user account configured in "". The user account must have .

    Grant Privileges

    The Spider Node connects to the Data Node with the user account configured in "".

    On the Data Node, grant the Spider user sufficient privileges to operate on the Data Table:

    Privileges for Spider BKA Mode

    By default, the Spider user also requires the privilege on the database containing the Data Table. The CREATE TEMPORARY TABLES privilege is required, because Spider uses temporary tables to optimize read queries when Spider BKA Mode is 1.

    Spider BKA Mode is configured using the following methods:

    • The session value is configured by setting the system variable on the Spider Node. The default value is -1. When the session value is -1, the value for each is used.

    • The value for each is configured by setting the bka_mode option in the COMMENT table option. When the bka_mode option is not set, the implicit value is 1.

    The default value is -1, and the implicit Spider Table value is 1, so the default Spider BKA Mode is 1.

    On the Data Node, grant the Spider user the CREATE TEMPORARY TABLES privilege on the database:

    Create the Spider Table

    The Spider Table must be created on the Spider Node with the same structure as the Data Table.

    On the Spider Node, create the Spider Table and reference the Data Node in the COMMENT table option:

    The COMMENT table option is used to configure the Data Node and the Data Table. Set the server option to the server object configured in "". Set the table option to the .

    An alternative syntax is available. When you don't want to create a server object, the connection details for the Data Node can be specified in the COMMENT table option:

    Next Step

    Navigation in the procedure "Deploy Spider Federated Topology":

    This page was step 2 of 3.

    Next: Step 3: Test Spider Federated Topology.

    Step 1: Install Enterprise Spider

    Overview

    This page details step 1 of the 3-step procedure "Deploy Spider Federated Topology".

    This step installs the Enterprise Spider storage engine plugin on the Spider Node.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Allow Interconnect

    MariaDB Enterprise Spider depends on interconnect between the Spider Node and the Data Node. This may require adjustment to firewall and security settings.

    Install Spider Package

    The plugin is not installed with MariaDB Enterprise Server by default. An additional package must be installed.

    Install via YUM (CentOS, RHEL)

    On the Spider Node, install MariaDB Enterprise Spider:

    Install via APT (Debian, Ubuntu)

    On the Spider Node, install MariaDB Enterprise Spider:

    Install via ZYpp (SLES)

    On the Spider Node, install MariaDB Enterprise Spider:

    Load the Spider Plugin

    The plugin must be loaded by MariaDB Enterprise Server.

    On the Spider Node, use one of the following methods to configure MariaDB Enterprise Server to load the Enterprise Spider storage engine plugin:

    Interface
    Method
    Benefits

    Load Spider with Configuration File

    On the Spider Node, set the plugin_load_add option to ha_spider in a configuration file. This option configures MariaDB Enterprise Server to load the Enterprise Spider storage engine plugin. The Spider Node must be restarted to detect the configuration change.

    1. Choose a configuration file for custom changes to system variables and options. It is not recommended to make custom changes to Enterprise Server's default configuration files, because your custom changes can be overwritten by other default configuration files that are loaded after. Ensure that your custom changes will be read last by creating a custom configuration file in one of the included directories. Configuration files in included directories are read in alphabetical order. Ensure that your custom configuration file is read last by using the z- prefix in the file name. Some example configuration file paths for different distributions are shown in the following table:

    Distributions
    Example configuration file path
    1. Set the plugin_load_add option in the configuration file. It must be set in a group that will be read by MariaDB Server, such as [mariadb] or [server]. For example:

    1. Restart MariaDB Enterprise Server:

    Load Spider with INSTALL SONAME

    On the Spider Node, execute the statement with the library name ha_spider. The INSTALL SONAME statement configures MariaDB Enterprise Server to load the Enterprise Spider storage engine plugin. The INSTALL SONAME statement requires the SUPER privilege.

    The INSTALL SONAME statement adds the Enterprise Spider storage engine to the system table. When the Spider Node is restarted, MariaDB Enterprise Server reads the system table and reloads the plugin, so the statement only needs to be executed once.

    1. Connect to the Spider Node using :

    1. Use the INSTALL SONAME statement to install the Enterprise Spider storage engine plugin:

    Test Plugin Installation

    On the Spider Node, confirm that the Enterprise Spider storage engine plugin is loaded by querying the information_schema.PLUGINS table:

    When the Enterprise Spider storage engine is loaded, the PLUGIN_NAME column contains the value SPIDER and the PLUGIN_STATUS column contains the value ACTIVE.

    Next Step

    Navigation in the procedure "Deploy Spider Federated Topology''.

    This page was step 1 of 3.

    Next: Step 2: Configure Spider Node and Data Node

    Step 1: Prepare Systems for Enterprise ColumnStore Nodes

    Overview

    This page details step 1 of a 5-step procedure for deploying Single-Node Enterprise ColumnStore with Object storage.

    This step prepares the system to host MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Optimize Linux Kernel Parameters

    MariaDB Enterprise ColumnStore performs best with Linux kernel optimizations.

    On each server to host an Enterprise ColumnStore node, optimize the kernel:

    1. Set the relevant kernel parameters in a sysctl configuration file. To ensure proper change management, use an Enterprise ColumnStore-specific configuration file.

    Create a /etc/sysctl.d/90-mariadb-enterprise-columnstore.conf file:

    1. Use the sysctl command to set the kernel parameters at runtime

    Temporarily Configure Linux Security Modules (LSM)

    The Linux Security Modules (LSM) should be temporarily disabled on each Enterprise ColumnStore node during installation.

    The LSM will be configured and re-enabled later in this deployment procedure.

    The steps to disable the LSM depend on the specific LSM used by the operating system.

    CentOS / RHEL Stop SELinux

    SELinux must be set to permissive mode before installing MariaDB Enterprise ColumnStore.

    To set SELinux to permissive mode:

    1. Set SELinux to permissive mode:

    1. Set SELinux to permissive mode by setting SELINUX=permissive in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Confirm that SELinux is in permissive mode:

    SELinux will be configured and re-enabled later in this deployment procedure. This configuration is not persistent. If you restart the server before configuring and re-enabling SELinux later in the deployment procedure, you must reset the enforcement to permissive mode.

    Debian / Ubuntu AppArmor

    AppArmor must be disabled before installing MariaDB Enterprise ColumnStore.

    1. Disable AppArmor:

    1. Reboot the system.

    2. Confirm that no AppArmor profiles are loaded using aa-status:

    AppArmor will be configured and re-enabled later in this deployment procedure.

    Configure Character Encoding

    When using MariaDB Enterprise ColumnStore, it is recommended to set the system's locale to UTF-8.

    1. On RHEL 8, install additional dependencies:

    1. Set the system's locale to en_US.UTF-8 by executing localedef:

    Create an S3 Bucket

    If you want to use S3-compatible storage, it is important to create the S3 bucket before you start ColumnStore.

    If you already have an S3 bucket, confirm that the bucket is empty.

    S3 bucket configuration will be performed later in this procedure.

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Object storage deployment procedure:

    This page was step 1 of 5.

    Next: Step 2: Install MariaDB Enterprise ColumnStore.

    Step 5: Start and Configure MariaDB MaxScale

    Overview

    This page details step 5 of the 6-step procedure "".

    This step configures MariaDB MaxScale to route connections to MariaDB Enterprise Cluster.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Step 7: Start and Configure MariaDB MaxScale

    Overview

    This page details step 7 of the 9-step procedure "".

    This step starts and configures MariaDB MaxScale 22.08.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Step 4: Test MariaDB Enterprise Server

    Overview

    This page details step 4 of the 7-step procedure "".

    This step tests MariaDB Enterprise Server

    Several actions require connection to MariaDB Enterprise Server. A command-line client (mariadb) was included with your ES installation. These instructions describe connection via Unix domain socket. Alternatively, a different client and connection method could be used.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Galera Cluster

    Overview

    This procedure describes the deployment of the Galera Cluster topology

    Step 2: Start and Configure MariaDB Enterprise Server on Primary Server

    Overview

    This page details step 2 of the 7-step procedure "".

    This step starts and configures a MariaDB Enterprise Server to operate as a primary server in MariaDB Replication.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    ODBC MariaDB Enterprise Spider Topology

    Overview

    In the ODBC MariaDB Enterprise Spider topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When the Spider Table is queried in this topology, the Enterprise Spider storage engine uses an ODBC foreign data wrapper to read from and write to an ODBC Data Source.

    Benefits

    Step 3: Test Spider Sharded Topology

    Overview

    This page details step 3 of the 3-step procedure "".

    This step tests MariaDB Enterprise Spider.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Step 3: Test Spider Federated Topology

    Overview

    This page details step 3 of the 3-step procedure "".

    This step tests MariaDB Enterprise Spider.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    [maxscale]
    threads          = auto
    admin_host       = 0.0.0.0
    admin_secure_gui = false
    $ sudo systemctl restart maxscale
    $ maxctrl create server mcs1 192.0.2.101
    $ maxctrl create server mcs2 192.0.2.102
    $ maxctrl create server mcs3 192.0.2.103
    $ maxctrl create monitor columnstore_monitor mariadbmon \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         replication_user=repl \
         replication_password='REPLICATION_USER_PASSWORD' \
         --servers mcs1 mcs2 mcs3
    $ maxctrl create service connection_router_service readconnroute \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         router_options=slave \
         --servers mcs1 mcs2 mcs3
    $ maxctrl create listener connection_router_service connection_router_listener 3308 \
         protocol=MariaDBClient
    $ maxctrl create service query_router_service readwritesplit  \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         --servers mcs1 mcs2 mcs3
    $ maxctrl create listener query_router_service query_router_listener 3307 \
         protocol=MariaDBClient
    $ maxctrl start services
    $ sudo yum install --enablerepo=PowerTools glusterfs-server
    $ sudo yum install centos-release-gluster
    $ sudo yum install glusterfs-server
    $ wget -O - https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub | apt-key add -
    
    $ DEBID=$(grep 'VERSION_ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"')
    $ DEBVER=$(grep 'VERSION=' /etc/os-release | grep -Eo '[a-z]+')
    $ DEBARCH=$(dpkg --print-architecture)
    $ echo deb https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/${DEBID}/${DEBARCH}/apt ${DEBVER} main > /etc/apt/sources.list.d/gluster.list
    $ sudo apt update
    $ sudo apt install glusterfs-server
    $ sudo apt update
    $ sudo apt install glusterfs-server
    $ sudo systemctl start glusterd
    $ sudo systemctl enable glusterd
    $ sudo gluster peer probe mcs2
    $ sudo gluster peer probe mcs3
    $ sudo gluster peer probe mcs1
    peer probe: Host mcs1 port 24007 already in peer list
    $ sudo gluster peer status
    Number of Peers: 2
    
    Hostname: mcs2
    Uuid: 3c8a5c79-22de-45df-9034-8ae624b7b23e
    State: Peer in Cluster (Connected)
    
    Hostname: mcs3
    Uuid: 862af7b2-bb5e-4b1c-8311-630fa32ed451
    State: Peer in Cluster (Connected)
    $ sudo mkdir -p /brick/storagemanager
    $ sudo gluster volume create storagemanager \
          replica 3 \
          mcs1:/brick/storagemanager \
          mcs2:/brick/storagemanager \
          mcs3:/brick/storagemanager \
          force
    $ sudo gluster volume start storagemanager
    $ sudo mkdir -p /var/lib/columnstore/storagemanager
    127.0.0.1:storagemanager /var/lib/columnstore/storagemanager glusterfs defaults,_netdev 0 0
    $ sudo mount -a
    $ sudo yum install --enablerepo=PowerTools glusterfs-server
    $ sudo yum install centos-release-gluster
    $ sudo yum install glusterfs-server
    $ wget -O - https://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub | apt-key add -
    
    $ DEBID=$(grep 'VERSION_ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"')
    $ DEBVER=$(grep 'VERSION=' /etc/os-release | grep -Eo '[a-z]+')
    $ DEBARCH=$(dpkg --print-architecture)
    $ echo deb https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/${DEBID}/${DEBARCH}/apt ${DEBVER} main > /etc/apt/sources.list.d/gluster.list
    $ sudo apt update
    $ sudo apt install glusterfs-server
    $ sudo apt update
    $ sudo apt install glusterfs-server
    $ sudo systemctl start glusterd
    $ sudo systemctl enable glusterd
    $ sudo gluster peer probe mcs2
    $ sudo gluster peer probe mcs3
    $ sudo gluster peer probe mcs1
    
    
    peer probe: Host mcs1 port 24007 already in peer list
    $ sudo gluster peer status
    Hostname: mcs2
    Uuid: 3c8a5c79-22de-45df-9034-8ae624b7b23e
    State: Peer in Cluster (Connected)
    
    Hostname: mcs3
    Uuid: 862af7b2-bb5e-4b1c-8311-630fa32ed451
    State: Peer in Cluster (Connected)
    $ sudo mkdir -p /brick/storagemanager
    $ sudo gluster volume create storagemanager \
          replica 3 \
          mcs1:/brick/storagemanager \
          mcs2:/brick/storagemanager \
          mcs3:/brick/storagemanager \
          force
    $ sudo gluster volume start storagemanager
    $ sudo mkdir -p /var/lib/columnstore/storagemanager
    127.0.0.1:storagemanager /var/lib/columnstore/storagemanager glusterfs defaults,_netdev 0 0
    $ sudo mount -a
    [maxscale]
    threads          = auto
    admin_host       = 0.0.0.0
    admin_secure_gui = false
    $ sudo systemctl restart maxscale
    $ maxctrl create server node1 192.0.2.101
    
    $ maxctrl create server node2 192.0.2.102
    
    $ maxctrl create server node3 192.0.2.103
    $ maxctrl create monitor mdb_monitor mariadbmon \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         replication_user=repl \
         replication_password='REPLICATION_USER_PASSWORD' \
         --servers node1 node2 node3
    $ maxctrl create service connection_router_service readconnroute \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         router_options=slave \
         --servers node1 node2 node3
    $ maxctrl create listener connection_router_service connection_router_listener 3308 \
         protocol=MariaDBClient
    $ maxctrl create service query_router_service readwritesplit  \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         --servers node1 node2 node3
    $ maxctrl create listener query_router_service query_router_listener 3307 \
         protocol=MariaDBClient
    $ maxctrl start services
    # minimize swapping
    vm.swappiness = 1
    
    # Increase the TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    
    # Increase the TCP buffer limits
    # min, default, and max number of bytes to use
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    
    # don't cache ssthresh from previous connection
    net.ipv4.tcp_no_metrics_save = 1
    
    # for 1 GigE, increase this to 2500
    # for 10 GigE, increase this to 30000
    net.core.netdev_max_backlog = 2500
    $ sudo sysctl --load=/etc/sysctl.d/90-mariadb-enterprise-columnstore.conf
    $ sudo setenforce permissive
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    Permissive
    $ sudo systemctl disable apparmor
    $ sudo aa-status
    apparmor module is loaded.
    0 profiles are loaded.
    0 profiles are in enforce mode.
    0 profiles are in complain mode.
    0 processes have profiles defined.
    0 processes are in enforce mode.
    0 processes are in complain mode.
    0 processes are unconfined but have a profile defined.
    $ sudo systemctl status firewalld
    $ sudo systemctl stop firewalld
    $ sudo ufw status verbose
    $ sudo ufw disable
    $ sudo yum install glibc-locale-source glibc-langpack-en
    $ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
    192.0.2.1     mcs1
    192.0.2.2     mcs2
    192.0.2.3     mcs3
    192.0.2.100   mxs1
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_columnstore%';
    +---------------------+---------------+
    | PLUGIN_NAME         | PLUGIN_STATUS |
    +---------------------+---------------+
    | Columnstore         | ACTIVE        |
    | COLUMNSTORE_COLUMNS | ACTIVE        |
    | COLUMNSTORE_TABLES  | ACTIVE        |
    | COLUMNSTORE_FILES   | ACTIVE        |
    | COLUMNSTORE_EXTENTS | ACTIVE        |
    +---------------------+---------------+
    CREATE DATABASE IF NOT EXISTS test;
    CREATE TABLE IF NOT EXISTS test.contacts (
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    ) ENGINE=ColumnStore;
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    SELECT * FROM test.contacts;
    +------------+-----------+----------------------+
    | first_name | last_name | email                |
    +------------+-----------+----------------------+
    | Kai        | Devi      | kai.devi@example.com |
    | Lee        | Wang      | lee.wang@example.com |
    +------------+-----------+----------------------+
    CREATE TABLE test.addresses (
       email VARCHAR(100),
       street_address VARCHAR(255),
       city VARCHAR(100),
       state_code VARCHAR(2)
    ) ENGINE = InnoDB;
    INSERT INTO test.addresses (email, street_address, city, state_code)
       VALUES
       ("kai.devi@example.com", "1660 Amphibious Blvd.", "Redwood City", "CA"),
       ("lee.wang@example.com", "32620 Little Blvd", "Redwood City", "CA");
    SELECT name AS "Name", addr AS "Address"
    FROM (SELECT CONCAT(first_name, " ", last_name) AS name,
       email FROM test.contacts) AS contacts
    INNER JOIN (SELECT CONCAT(street_address, ", ", city, ", ", state_code) AS addr,
       email FROM test.addresses) AS addr
    WHERE  contacts.email = addr.email;
    +----------+-----------------------------------------+
    | Name     | Address                                 |
    +----------+-----------------------------------------+
    | Kai Devi | 1660 Amphibious Blvd., Redwood City, CA |
    | Lee Wang | 32620 Little Blvd, Redwood City, CA     |
    +----------+-----------------------------------------+
    
    +-------------------+-------------------------------------+
    | Name              | Address                             |
    +-------------------+-------------------------------------+
    | Walker Percy      | 500 Thomas More Dr., Covington, LA  |
    | Flannery O'Connor | 300 Tarwater Rd., Milledgeville, GA |
    +-------------------+-------------------------------------+
    # minimize swapping
    vm.swappiness = 1
    
    # Increase the TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    
    # Increase the TCP buffer limits
    # min, default, and max number of bytes to use
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    
    # don't cache ssthresh from previous connection
    net.ipv4.tcp_no_metrics_save = 1
    
    # for 1 GigE, increase this to 2500
    # for 10 GigE, increase this to 30000
    net.core.netdev_max_backlog = 2500
    $ sudo sysctl --load=/etc/sysctl.d/90-mariadb-enterprise-columnstore.conf
    $ sudo setenforce permissive
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    Permissive
    $ sudo systemctl disable apparmor
    $ sudo aa-status
    apparmor module is loaded.
    0 profiles are loaded.
    0 profiles are in enforce mode.
    0 profiles are in complain mode.
    0 processes have profiles defined.
    0 processes are in enforce mode.
    0 processes are in complain mode.
    0 processes are unconfined but have a profile defined.
    $ sudo yum install glibc-locale-source glibc-langpack-en
    $ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
    # minimize swapping
    vm.swappiness = 1
    
    # Increase the TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    
    # Increase the TCP buffer limits
    # min, default, and max number of bytes to use
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    
    # don't cache ssthresh from previous connection
    net.ipv4.tcp_no_metrics_save = 1
    
    # for 1 GigE, increase this to 2500
    # for 10 GigE, increase this to 30000
    net.core.netdev_max_backlog = 2500
    $ sudo sysctl --load=/etc/sysctl.d/90-mariadb-enterprise-columnstore.conf
    $ sudo setenforce permissive
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    Permissive
    $ sudo systemctl disable apparmor
    $ sudo aa-status
    
    apparmor module is loaded.
    0 profiles are loaded.
    0 profiles are in enforce mode.
    0 profiles are in complain mode.
    0 processes have profiles defined.
    0 processes are in enforce mode.
    0 processes are in complain mode.
    0 processes are unconfined but have a profile defined.
    $ sudo yum install glibc-locale-source glibc-langpack-en
    $ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
    $ sudo testS3Connection
    StorageManager[26887]: Using the config file found at /etc/columnstore/storagemanager.cnf
    StorageManager[26887]: S3Storage: S3 connectivity & permissions are OK
    S3 Storage Manager Configuration OK
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_columnstore%';
    
    +---------------------+---------------+
    | PLUGIN_NAME         | PLUGIN_STATUS |
    +---------------------+---------------+
    | Columnstore         | ACTIVE        |
    | COLUMNSTORE_COLUMNS | ACTIVE        |
    | COLUMNSTORE_TABLES  | ACTIVE        |
    | COLUMNSTORE_FILES   | ACTIVE        |
    | COLUMNSTORE_EXTENTS | ACTIVE        |
    +---------------------+---------------+
    $ systemctl status mariadb-columnstore-cmapi
    $ sudo systemctl start mariadb-columnstore-cmapi
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      },
      "192.0.2.2": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "192.0.2.3": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "num_nodes": 3
    }
    $ sudo mariadb
    CREATE DATABASE IF NOT EXISTS test;
    
    CREATE TABLE IF NOT EXISTS test.contacts (
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    ) ENGINE = ColumnStore;
    $ sudo mariadb
    SHOW CREATE TABLE test.contacts\G;
    $ sudo mariadb
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    $ sudo mariadb
    SELECT * FROM test.contacts;
    
    +------------+-----------+----------------------+
    | first_name | last_name | email                |
    +------------+-----------+----------------------+
    | Kai        | Devi      | kai.devi@example.com |
    | Lee        | Wang      | lee.wang@example.com |
    +------------+-----------+----------------------+
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_columnstore%';
    
    +---------------------+---------------+
    | PLUGIN_NAME         | PLUGIN_STATUS |
    +---------------------+---------------+
    | Columnstore         | ACTIVE        |
    | COLUMNSTORE_COLUMNS | ACTIVE        |
    | COLUMNSTORE_TABLES  | ACTIVE        |
    | COLUMNSTORE_FILES   | ACTIVE        |
    | COLUMNSTORE_EXTENTS | ACTIVE        |
    +---------------------+---------------+
    $ systemctl status mariadb-columnstore-cmapi
    $ sudo systemctl start mariadb-columnstore-cmapi
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      },
      "192.0.2.2": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "192.0.2.3": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "num_nodes": 3
    }
    $ sudo mariadb
    CREATE DATABASE IF NOT EXISTS test;
    
    CREATE TABLE IF NOT EXISTS test.contacts (
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    ) ENGINE = ColumnStore;
    $ sudo mariadb
    SHOW CREATE TABLE test.contacts\G;
    $ sudo mariadb
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    $ sudo mariadb
    SELECT * FROM test.contacts;
    
    +------------+-----------+----------------------+
    | first_name | last_name | email                |
    +------------+-----------+----------------------+
    | Kai        | Devi      | kai.devi@example.com |
    | Lee        | Wang      | lee.wang@example.com |
    +------------+-----------+----------------------+
    $ sudo yum install curl
    $ sudo apt install curl apt-transport-https
    $ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
    $ echo "${checksum}  mariadb_es_repo_setup" \
           | sha256sum -c -
    $ chmod +x mariadb_es_repo_setup
    $ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
          --skip-maxscale \
          --skip-tools \
          --mariadb-server-version="11.4"
    $ sudo yum install epel-release
    
    $ sudo yum install jemalloc
    $ sudo apt install libjemalloc2
    $ sudo apt install libjemalloc1
    $ sudo yum install MariaDB-server \
          MariaDB-backup \
          MariaDB-shared \
          MariaDB-client \
          MariaDB-columnstore-engine
    $ sudo apt install mariadb-server \
          mariadb-backup \
          libmariadb3 \
          mariadb-client \
          mariadb-plugin-columnstore
    $ sudo yum install curl
    $ sudo apt install curl apt-transport-https
    $ sudo zypper install curl
    $ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
    
    $ echo "${checksum}  mariadb_es_repo_setup" \
           | sha256sum -c -
    
    $ chmod +x mariadb_es_repo_setup
    
    $ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
          --skip-server \
          --skip-tools \
          --mariadb-maxscale-version="25.01"
    $ sudo yum install maxscale
    $ sudo apt install maxscale
    $ sudo zypper install maxscale
    CREATE DATABASE inventory;
    CREATE TABLE inventory.products (
       product_name VARCHAR(11) NOT NULL DEFAULT '',
       supplier VARCHAR(128) NOT NULL DEFAULT '',
       quantity VARCHAR(128) NOT NULL DEFAULT '',
       unit_cost VARCHAR(128) NOT NULL DEFAULT ''
    ) ENGINE=Columnstore DEFAULT CHARSET=utf8;
    $ sudo cpimport -s '\t' inventory products /tmp/inventory-products.tsv
    LOAD DATA INFILE '/tmp/inventory-products.tsv'
    INTO TABLE inventory.products;
    $ mariadb --quick \
       --skip-column-names \
       --execute="SELECT * FROM inventory.products" \
       | cpimport -s '\t' inventory products
    $ sudo yum install curl
    $ sudo apt install curl apt-transport-https
    $ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
    $ echo "${checksum}  mariadb_es_repo_setup" \
          
     | sha256sum -c -
    $ chmod +x mariadb_es_repo_setup
    $ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
          --skip-maxscale \
          --skip-tools \
          --mariadb-server-version="11.4"
    $ sudo yum install epel-release
    
    $ sudo yum install jemalloc
    $ sudo apt install libjemalloc2
    $ sudo apt install libjemalloc1
    $ sudo yum install MariaDB-server \
       MariaDB-backup \
       MariaDB-shared \
       MariaDB-client \
       MariaDB-columnstore-engine
    $ sudo apt install mariadb-server \
       mariadb-backup \
       libmariadb3 \
       mariadb-client \
       mariadb-plugin-columnstore

    character_set_server

    Set this system variable to utf8

    collation_server

    Set this system variable to utf8_general_ci

    columnstore_use_import_for_batchinsert

    Set this system variable to ALWAYS to always use cpimport for LOAD DATA INFILE and INSERT...SELECT statements.

    CREATE USER
    Credentials Management for MariaDB Enterprise ColumnStore
    How to create an AppArmor Profile

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Rocky Linux 8 (x86_64, ARM64)
  • Rocky Linux 9 (x86_64, ARM64)

  • Ubuntu 20.04 LTS (x86_64, ARM64)

  • Ubuntu 22.04 LTS (x86_64, ARM64)

  • Ubuntu 24.04 LTS (x86_64, ARM64)

  • Step 1

    Prepare System for Enterprise ColumnStore

    Step 2

    Install Enterprise ColumnStore

    Step 3

    Start and Configure Enterprise ColumnStore 23.10

    Step 4

    Test Enterprise ColumnStore

    Step 5

    Bulk Import Data to Enterprise ColumnStore

    MariaDB Enterprise Server

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    MariaDB Enterprise ColumnStore

    • Columnar Storage Engine

    • Optimized for Online Analytical Processing (OLAP) workloads

    Enterprise ColumnStore node

    4+ cores

    16+ GB

    Enterprise ColumnStore node

    64+ cores

    128+ GB

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set system variables and options. The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set system variables and options.

    SQL

    Users can set system variables that support dynamic changes on-the-fly using the SET statement.

    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    submitting a support case
    Enterprise ColumnStore with Shared Local storage
    recommended hardware requirements

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    MariaDB Client
    information_schema.PLUGINS

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    CREATE USER
    Grant Privileges on the Data Table
    CREATE SERVER
    CREATE TABLE
    creating the Spider Table
    Configure Connection Details
    privileges on the tables
    Create Spider User
    CREATE TEMPORARY TABLES
    spider_bka_mode
    Spider Table
    Spider Table
    spider_bka_mode
    Configure Connection Details
    Data Table

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Shell

    Configuration File

    • SQL access is not required

    • SUPER privilege is not required

    • Configuration file can be version controlled

    SQL

    INSTALL SONAME Statement

    • Shell access is not required

    • File system privileges on configuration file are not required

    • Plugin is included in backup of mysql.plugin system table

    • Spider Node restart is not required

    • CentOS

    • RHEL

    • Rocky Linux

    • SLES

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    Enterprise Spider storage engine
    Enterprise Spider storage engine
    INSTALL SONAME
    mysql.plugin
    mariadb Client

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Test Enterprise Server Service

    Use Systemd to test whether the MariaDB Enterprise Server service is running.

    This action is performed on each Enterprise Server node.

    Check if the MariaDB Enterprise Server service is running by executing the following:

    If the service is not running on any node, start the service by executing the following on that node:

    Test Local Client Connections

    Use mariadb Client to test the local connection to the Enterprise Server node.

    This action is performed on each Enterprise Server node:

    The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

    Test Replica Status

    Use SHOW REPLICA STATUS to check that replication is running properly on the replica servers.

    This action is performed on each replica server.

    Execute the following:

    If Slave_IO_Running column is not Yes on any replica server, then check:

    • The network connectivity between the replica server and the primary server

    • The Last_IO_Error column for details on any errors

    If Slave_SQL_Running column is not Yes on any replica server, then check:

    • The GTID position in gtid_slave_pos

    • The Last_SQL_Error column for details on any errors

    If both columns are not Yes on any replica server, then check:

    • The replication configuration on the replica server.

    If you need to make any corrections, the slave threads can be restarted with START REPLICA.

    Test DDL

    Use mariadb Client to test DDL.

    1. On the primary server, use the mariadb Client to connect to the node:

    1. Create a test database and table:

    1. On each replica server, use the mariadb Client to connect to the node:

    1. Confirm that the database and table exist:

    If the database or table do not exist on any node, then check the replication status on the node.

    Test DML

    Use mariadb Client to test DML.

    1. On the primary server, use the MariaDB Client to connect to the node:

    1. Insert sample data into the table created in the DDL test:

    1. On each replica server, use the mariadb Client to connect to the node:

    1. Execute a SELECT query to retrieve the data:

    If the data is not returned on any node, then check the replication status on the node.

    Next Step

    Navigation in the procedure "Deploy Primary/Replica Topology":

    This page was step 4 of 7.

    Next: Step 5: Install MariaDB MaxScale

    Deploy Primary/Replica Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Test Enterprise Server Service

    Use Systemd to test whether the MariaDB Enterprise Server service is running.

    This action is performed on the Spider Node and each Data Node.

    Check if the MariaDB Enterprise Server service is running by executing the following:

    If the service is not running on any node, start the service by executing the following on that node:

    Test Local Client Connections

    Use mariadb Client to test the local connection to the Enterprise Server node.

    This action is performed on the Spider Node and each Data Node:

    The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

    Test Data Node Client Connection

    Use mariadb Client to test a client connection to the Data Node from the Spider Node using the Spider user.

    This action is performed on the Spider Node:

    The host and port of the Data Node can be provided using the --host and --port command-line options. The credentials for the Spider user can be provided using the --user and --password command-line options.

    If the Spider user is unable to connect to the Data Node from the Spider Node, check the password for the Spider user account on the Data Node.

    For additional information, see "Create Spider User".

    Test Spider Storage Engine Plugin

    Query the information_schema.PLUGINS table to confirm that the Enterprise Spider storage engine is loaded.

    This action is performed on the Spider Node.

    Execute the following query:

    The PLUGIN_STATUS column for each Spider-related plugin should contain ACTIVE.

    For additional information, see "Load the Spider Plugin".

    Test Write Operations

    Write to the Spider Table using an INSERT statement to test write operations.

    This action is performed on the Spider Node.

    Execute the following query:

    Test Read Operations

    Read from the Spider Table using a SELECT statement to test read operations.

    This action is performed on the Spider Node.

    Execute the following query:

    Test Sharding

    Use the EXPLAIN PARTITIONS statement with a SELECT statement to determine which shards Spider will read for the query.

    This action is performed on the Spider Node.

    Execute the following query:

    The specific shards read by the query are listed in the partitions column. If partition pruning does not eliminate unnecessary shards for a query with a restrictive filter, then check the partition definitions.

    Next Step

    Navigation in the procedure "Deploy Spider Sharded Topology":

    This page was step 3 of 3.

    This procedure is complete.

    Deploy Spider Sharded Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Test Enterprise Server Service

    Use Systemd to test whether the MariaDB Enterprise Server service is running.

    This action is performed on the Spider Node and Data Node.

    Check if the MariaDB Enterprise Server service is running by executing the following:

    If the service is not running on any node, start the service by executing the following on that node:

    Test Local Client Connections

    Use MariaDB Client to test the local connection to the Enterprise Server node.

    This action is performed on the Spider Node and Data Node:

    The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

    Test Data Node Client Connection

    Use mariadb Client to test a client connection to the Data Node from the Spider Node using the Spider user.

    This action is performed on the Spider Node:

    The host and port of the Data Node can be provided using the --host and --port command-line options. The credentials for the Spider user can be provided using the --user and --password command-line options.

    If the Spider user is unable to connect to the Data Node from the Spider Node, check the password for the Spider user account on the Data Node.

    For additional information, see "Create Spider User".

    Test Spider Storage Engine Plugin

    Query the information_schema.PLUGINS table to confirm that the Enterprise Spider storage engine is loaded.

    This action is performed on the Spider Node.

    Execute the following query:

    The PLUGIN_STATUS column for each Spider-related plugin should contain ACTIVE.

    For additional information, see "Load the Spider Plugin".

    Test Write Operations

    Write to the Spider Table using an INSERT statement to test write operations.

    This action is performed on the Spider Node.

    Execute the following query:

    Test Read Operations

    Read from the Spider Table using a SELECT statement to test read operations.

    This action is performed on the Spider Node.

    Execute the following query:

    Next Step

    Navigation in the procedure "Deploy Spider Federated Topology".

    This page was step 3 of 3.

    This procedure is complete.

    Deploy Spider Federated Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    [mariadb]
    log_error                              = mariadbd.err
    character_set_server                   = utf8
    collation_server                       = utf8_general_ci
    $ sudo systemctl start mariadb
    
    $ sudo systemctl enable mariadb
    $ sudo systemctl start mariadb-columnstore
    
    $ sudo systemctl enable mariadb-columnstore
    CREATE USER 'util_user'@'127.0.0.1'
    IDENTIFIED BY 'util_user_passwd';
    GRANT SELECT, PROCESS ON *.*
    TO 'util_user'@'127.0.0.1';
    $ sudo mcsSetConfig CrossEngineSupport Host 127.0.0.1
    
    $ sudo mcsSetConfig CrossEngineSupport Port 3306
    
    $ sudo mcsSetConfig CrossEngineSupport User util_user
    $ sudo mcsSetConfig CrossEngineSupport Password util_user_passwd
    $ sudo yum install policycoreutils policycoreutils-python
    $ sudo yum install policycoreutils python3-policycoreutils policycoreutils-python-utils
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    
    Nothing to do
    $ sudo semodule -i mariadb_local.pp
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo setenforce enforcing
    Apr 30 21:54:35 a1ebc96a2519 PrimProc[1004]: 35.668435 |0|0|0| C 28 CAL0000: Error total memory available is less than 3GB.
    ERROR 1815 (HY000): Internal error: System is not ready yet. Please try again.
    $ sudo testS3Connection
    StorageManager[26887]: Using the config file found at /etc/columnstore/storagemanager.cnf
    StorageManager[26887]: S3Storage: S3 connectivity & permissions are OK
    S3 Storage Manager Configuration OK
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_columnstore%';
    +---------------------+---------------+
    | PLUGIN_NAME         | PLUGIN_STATUS |
    +---------------------+---------------+
    | Columnstore         | ACTIVE        |
    | COLUMNSTORE_COLUMNS | ACTIVE        |
    | COLUMNSTORE_TABLES  | ACTIVE        |
    | COLUMNSTORE_FILES   | ACTIVE        |
    | COLUMNSTORE_EXTENTS | ACTIVE        |
    +---------------------+---------------+
    CREATE DATABASE IF NOT EXISTS test;
    CREATE TABLE IF NOT EXISTS test.contacts (
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    ) ENGINE=ColumnStore;
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    SELECT * FROM test.contacts;
    
    +------------+-----------+----------------------+
    | first_name | last_name | email                |
    +------------+-----------+----------------------+
    | Kai        | Devi      | kai.devi@example.com |
    | Lee        | Wang      | lee.wang@example.com |
    +------------+-----------+----------------------+
    CREATE TABLE test.addresses (
       email VARCHAR(100),
       street_address VARCHAR(255),
       city VARCHAR(100),
       state_code VARCHAR(2)
    ) ENGINE = InnoDB;
    INSERT INTO test.addresses (email, street_address, city, state_code)
       VALUES
       ("kai.devi@example.com", "1660 Amphibious Blvd.", "Redwood City", "CA"),
       ("lee.wang@example.com", "32620 Little Blvd", "Redwood City", "CA");
    SELECT name AS "Name", addr AS "Address"
    FROM (SELECT CONCAT(first_name, " ", last_name) AS name,
       email FROM test.contacts) AS contacts
    INNER JOIN (SELECT CONCAT(street_address, ", ", city, ", ", state_code) AS addr,
       email FROM test.addresses) AS addr
    WHERE  contacts.email = addr.email;
    +----------+-----------------------------------------+
    | Name     | Address                                 |
    +----------+-----------------------------------------+
    | Kai Devi | 1660 Amphibious Blvd., Redwood City, CA |
    | Lee Wang | 32620 Little Blvd, Redwood City, CA     |
    +----------+-----------------------------------------+
    
    +-------------------+-------------------------------------+
    | Name              | Address                             |
    +-------------------+-------------------------------------+
    | Walker Percy      | 500 Thomas More Dr., Covington, LA  |
    | Flannery O'Connor | 300 Tarwater Rd., Milledgeville, GA |
    +-------------------+-------------------------------------+
    CREATE USER spider_user@192.0.2.1 IDENTIFIED BY "password";
    $ mariadb --user spider_user --host 192.0.2.2 --password
    CREATE SERVER hq_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.2",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "hq_sales"
    );
    CREATE DATABASE hq_sales;
    
    CREATE SEQUENCE hq_sales.invoice_seq;
    
    CREATE TABLE hq_sales.invoices (
       branch_id INT NOT NULL DEFAULT (1) CHECK (branch_id=1),
       invoice_id INT NOT NULL DEFAULT (NEXT VALUE FOR hq_sales.invoice_seq),
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=InnoDB;
    
    INSERT INTO hq_sales.invoices
       (customer_id, invoice_date, invoice_total, payment_method)
    VALUES
       (1, '2020-05-10 12:35:10', 1087.23, 'CREDIT_CARD'),
       (2, '2020-05-10 14:17:32', 1508.57, 'WIRE_TRANSFER'),
       (3, '2020-05-10 14:25:16', 227.15, 'CASH');
    GRANT ALL PRIVILEGES ON hq_sales.invoices TO 'spider_user'@'192.0.2.1';
    GRANT CREATE TEMPORARY TABLES ON hq_sales.* TO 'spider_user'@'192.0.2.1';
    CREATE DATABASE spider_hq_sales;
    
    CREATE TABLE spider_hq_sales.invoices (
       branch_id INT NOT NULL,
       invoice_id INT NOT NULL,
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=Spider
    COMMENT='server "hq_server", table "invoices"';
    CREATE TABLE spider_hq_sales.invoices_alternate (
       branch_id INT NOT NULL,
       invoice_id INT NOT NULL,
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=Spider
    COMMENT='table "invoices", host "192.0.2.2", port "5801", user "spider_user", password "user_password", database "hq_sales"';
    $ sudo yum install MariaDB-spider-engine
    $ sudo apt install mariadb-plugin-spider
    $ sudo zypper install MariaDB-spider-engine
    [mariadb]
    ...
    plugin_load_add = "ha_spider"
    $ sudo systemctl restart mariadb
    $ sudo mariadb
    INSTALL SONAME "ha_spider";
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE "ha_spider%";
    
    +--------------------------+---------------+
    | PLUGIN_NAME              | PLUGIN_STATUS |
    +--------------------------+---------------+
    | SPIDER                   | ACTIVE        |
    | SPIDER_ALLOC_MEM         | ACTIVE        |
    | SPIDER_WRAPPER_PROTOCOLS | ACTIVE        |
    +--------------------------+---------------+
    # minimize swapping
    vm.swappiness = 1
    
    # Increase the TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    
    # Increase the TCP buffer limits
    # min, default, and max number of bytes to use
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    
    # don't cache ssthresh from previous connection
    net.ipv4.tcp_no_metrics_save = 1
    
    # for 1 GigE, increase this to 2500
    # for 10 GigE, increase this to 30000
    net.core.netdev_max_backlog = 2500
    $ sudo sysctl --load=/etc/sysctl.d/90-mariadb-enterprise-columnstore.conf
    $ sudo setenforce permissive
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    Permissive
    $ sudo systemctl disable apparmor
    $ sudo aa-status
    apparmor module is loaded.
    0 profiles are loaded.
    0 profiles are in enforce mode.
    0 profiles are in complain mode.
    0 processes have profiles defined.
    0 processes are in enforce mode.
    0 processes are in complain mode.
    0 processes are unconfined but have a profile defined.
    $ sudo yum install glibc-locale-source glibc-langpack-en
    $ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SHOW REPLICA STATUS\G
    
    *************************** 1. row ***************************
                    Slave_IO_State: Waiting for master to send event
                       Master_Host: 192.0.2.1
                       Master_User: repl
                       Master_Port: 3306
                     Connect_Retry: 60
                   Master_Log_File: mariadb-bin.000001
               Read_Master_Log_Pos: 645
                    Relay_Log_File: li282-189-relay-bin.000002
                     Relay_Log_Pos: 946
             Relay_Master_Log_File: mariadb-bin.000001
                  Slave_IO_Running: Yes
                 Slave_SQL_Running: Yes
                   Replicate_Do_DB:
               Replicate_Ignore_DB:
                Replicate_Do_Table:
            Replicate_Ignore_Table:
           Replicate_Wild_Do_Table:
       Replicate_Wild_Ignore_Table:
                        Last_Errno: 0
                        Last_Error:
                      Skip_Counter: 0
               Exec_Master_Log_Pos: 645
                   Relay_Log_Space: 1259
                   Until_Condition: None
                    Until_Log_File:
                     Until_Log_Pos: 0
                Master_SSL_Allowed: No
                Master_SSL_CA_File:
                Master_SSL_CA_Path:
                   Master_SSL_Cert:
                 Master_SSL_Cipher:
                    Master_SSL_Key:
             Seconds_Behind_Master: 0
     Master_SSL_Verify_Server_Cert: No
                     Last_IO_Errno: 0
                     Last_IO_Error:
                    Last_SQL_Errno: 0
                    Last_SQL_Error:
       Replicate_Ignore_Server_Ids:
                  Master_Server_Id: 1
                    Master_SSL_Crl:
                Master_SSL_Crlpath:
                        Using_Gtid: Slave_Pos
                       Gtid_IO_Pos: 0-1-2
           Replicate_Do_Domain_Ids:
       Replicate_Ignore_Domain_Ids:
                     Parallel_Mode: optimistic
                         SQL_Delay: 0
               SQL_Remaining_Delay: NULL
           Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                  Slave_DDL_Groups: 2
    Slave_Non_Transactional_Groups: 0
        Slave_Transactional_Groups: 0
    $ sudo mariadb
    CREATE DATABASE IF NOT EXISTS test;
    
    CREATE TABLE test.contacts (
       id INT PRIMARY KEY AUTO_INCREMENT,
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    );
    $ sudo mariadb
    SHOW CREATE TABLE test.contacts\G;
    $ sudo mariadb
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    $ sudo mariadb
    SELECT * FROM test.contacts;
    
    +----+------------+-----------+----------------------+
    | id | first_name | last_name | email                |
    +----+------------+-----------+----------------------+
    | 1  | Kai        | Devi      | kai.devi@example.com |
    | 2  | Lee        | Wang      | lee.wang@example.com |
    +----+------------+-----------+----------------------+
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    $ mariadb \
       --host 192.0.2.2 \
       --user spider_user \
       --password
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_spider%';
    
    +--------------------------+---------------+
    | PLUGIN_NAME              | PLUGIN_STATUS |
    +--------------------------+---------------+
    | SPIDER                   | ACTIVE        |
    | SPIDER_ALLOC_MEM         | ACTIVE        |
    | SPIDER_WRAPPER_PROTOCOLS | ACTIVE        |
    +--------------------------+---------------+
    INSERT INTO spider_hq_sales.invoices
       (branch_id, invoice_id, customer_id, invoice_date, invoice_total, payment_method)
    VALUES (1, 4, 1, '2021-03-10 12:45:10', 3045.73, 'CREDIT_CARD');
    SELECT * FROM spider_sharded_sales.invoices;
    +-----------+------------+-------------+----------------------------+---------------+----------------+
    | branch_id | invoice_id | customer_id | invoice_date               | invoice_total | payment_method |
    +-----------+------------+-------------+----------------------------+---------------+----------------+
    |         1 |          1 |           1 | 2020-05-10 12:35:10.000000 |       1087.23 | CREDIT_CARD    |
    |         1 |          2 |           2 | 2020-05-10 14:17:32.000000 |       1508.57 | WIRE_TRANSFER  |
    |         1 |          3 |           3 | 2020-05-10 14:25:16.000000 |        227.15 | CASH           |
    |         1 |          4 |           1 | 2021-03-10 12:45:10.000000 |       3045.73 | CREDIT_CARD    |
    |         2 |          1 |           2 | 2020-05-10 12:31:00.000000 |       1351.04 | CREDIT_CARD    |
    |         2 |          2 |           2 | 2020-05-10 12:45:27.000000 |        162.11 | WIRE_TRANSFER  |
    |         2 |          3 |           4 | 2020-05-10 13:11:23.000000 |        350.00 | CASH           |
    |         3 |          1 |           5 | 2020-05-10 12:31:00.000000 |        111.50 | CREDIT_CARD    |
    |         3 |          2 |           8 | 2020-05-10 12:45:27.000000 |       1509.23 | WIRE_TRANSFER  |
    |         3 |          3 |           3 | 2020-05-10 13:11:23.000000 |       3301.66 | CASH           |
    +-----------+------------+-------------+----------------------------+---------------+----------------+
    EXPLAIN PARTITIONS
    SELECT * FROM spider_sharded_sales.invoices
    WHERE customer_id = 4;
    +------+-------------+----------+--------------------------------------------------+------+---------------+------+---------+------+------+-----------------------------------+
    | id   | select_type | table    | partitions                                       | type | possible_keys | key  | key_len | ref  | rows | Extra                             |
    +------+-------------+----------+--------------------------------------------------+------+---------------+------+---------+------+------+-----------------------------------+
    |    1 | SIMPLE      | invoices | hq_partition,eastern_partition,western_partition | ALL  | NULL          | NULL | NULL    | NULL | 9    | Using where with pushed condition |
    +------+-------------+----------+--------------------------------------------------+------+---------------+------+---------+------+------+-----------------------------------+
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    $ mariadb \
       --host 192.0.2.2 \
       --user spider_user \
       --password
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_spider%';
    
    +--------------------------+---------------+
    | PLUGIN_NAME              | PLUGIN_STATUS |
    +--------------------------+---------------+
    | SPIDER                   | ACTIVE        |
    | SPIDER_ALLOC_MEM         | ACTIVE        |
    | SPIDER_WRAPPER_PROTOCOLS | ACTIVE        |
    +--------------------------+---------------+
    INSERT INTO spider_hq_sales.invoices
       (branch_id, invoice_id, customer_id, invoice_date, invoice_total, payment_method)
    VALUES (1, 4, 1, '2021-03-10 12:45:10', 3045.73, 'CREDIT_CARD');
    SELECT * FROM spider_hq_sales.invoices;
    
    +-----------+------------+-------------+----------------------------+---------------+----------------+
    | branch_id | invoice_id | customer_id | invoice_date               | invoice_total | payment_method |
    +-----------+------------+-------------+----------------------------+---------------+----------------+
    |         1 |          1 |           1 | 2020-05-10 12:35:10.000000 |       1087.23 | CREDIT_CARD    |
    |         1 |          2 |           2 | 2020-05-10 14:17:32.000000 |       1508.57 | WIRE_TRANSFER  |
    |         1 |          3 |           3 | 2020-05-10 14:25:16.000000 |        227.15 | CASH           |
    |         1 |          4 |           1 | 2021-03-10 12:45:10.000000 |       3045.73 | CREDIT_CARD    |
    +-----------+------------+-------------+----------------------------+---------------+----------------+

    Sets the Group Communications back-end (usually gcomm:), followed by a comma-separated list of IP addresses or domain names for each Cluster Node. It is best practice to include all Enterprise Cluster nodes in this list.

    Sets the logical name for the cluster. Must be the same on all Cluster Nodes.

    wsrep_on

    Enables Enterprise Cluster.

    Path to the Galera Enterprise 4 wsrep provider plugin. In MariaDB Enterprise Cluster 11.4, the path is /usr/lib/galera/libgalera_enterprise_smm.so on Debian and Ubuntu and /usr/lib64/galera/libgalera_enterprise_smm.so on CentOS, RHEL, and SLES.

    Accepts options for the Galera Enterprise 4 wsrep provider plugin. Multiple options can be specified, separated by a semi-colon (;). For example, can be used to configure Galera cache size or to enable TLS. For a complete list of available options, see wsrep_provider_options

    ca-cert.pem

    Certificate Authority (CA) file.

    server-cert.pem

    X.509 certificate file.

    server-key.pem

    X.509 key file.

    bind_address

    The network socket Enterprise Cluster listens on for incoming TCP/IP client connections. On Debian or Ubuntu, this system variable must be set to override the 127.0.0.1 default configuration.

    binlog_format

    Enterprise Cluster requires use of the ROW Binary Log format.

    innodb_autoinc_lock_mode

    Enterprise Cluster requires an auto-increment lock mode of 2.

    ssl_ca

    Certificate Authority (CA) file in PEM format.

    ssl_cert

    X.509 certificate file in PEM format.

    ssl_key

    X.509 key file in PEM format.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Replace the Default Configuration File

    MariaDB MaxScale installations include a configuration file with some example objects. This configuration file should be replaced.

    On the MaxScale node, replace the default /etc/maxscale.cnf with the following configuration:

    For additional information, see "Global Parameters".

    Restart MaxScale

    On the MaxScale node, restart the MaxScale service to ensure that MaxScale picks up the new configuration:

    For additional information, see "Start and Stop Services".

    Create MaxScale User Account

    MariaDB MaxScale connects to Enterprise Cluster through the client port. MaxScale requires its own user account to monitor and orchestrate Enterprise Cluster nodes.

    1. On any Enterprise Cluster node, use the CREATE USER statement to create a new user for MaxScale:

    1. Use the GRANT statement to grant required privileges to the MaxScale user:

    Enterprise Cluster replicates the new user and privileges to the other Enterprise Cluster nodes.

    Configure Server Objects

    MariaDB MaxScale uses server objects to define the connections it makes to MariaDB Enterprise Servers.

    On the MaxScale node, use maxctrl create server to create a server object for each MariaDB Enterprise Server:

    Configure the Galera Monitor

    MaxScale uses monitors to retrieve additional information from the servers. This information is used by other services in filtering and routing connections based on the current state of the node. For Enterprise Cluster, use the Galera Monitor (galeramon).

    On the MaxScale node, use maxctrl create monitor to create a Galera Monitor for the cluster:

    In this example:

    • cluster_monitor is an arbitrary name that is used to identify the new monitor.

    • galeramon is the name of the module that implements the Galera Monitor.

    • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to monitor the ES nodes.

    • password='MAXSCALE_USER_PASSWORD' sets the password parameter to the password used by the database user account that MaxScale uses to monitor the ES nodes.

    • --servers sets the servers parameter to the set of nodes that MaxScale should monitor. All non-option arguments after --servers are interpreted as server names.

    • Other Module Parameters supported by galeramon in MaxScale 25.01 can also be specified.

    Choose a MaxScale Router

    Routers control how MaxScale balances the load between Enterprise Cluster nodes. Each router uses a different approach to routing queries. Consider the specific use case of your application and database load and select the router that best suits your needs.

    Router
    Configuration Procedure
    Description

    Configure Read Connection Router

    • Connection-based load balancing • Routes connections to Enterprise ColumnStore nodes designated as replica servers for a read-only pool • Routes connections to an Enterprise ColumnStore node designated as the primary server for a read-write pool.

    Configure Read/Write Split

    • Query-based load balancing • Routes write queries to an Enterprise ColumnStore node designated as the primary server • Routes read queries to Enterprise ColumnStore node designated as replica servers • Automatically reconnects after node failures • Automatically replays transactions after node failures • Optionally enforces causal reads

    Configure Read Connection Router

    Use MaxScale Read Connection Router (readconnroute) to route connections to replica servers for a read-only pool.

    On the MaxScale node, use maxctrl create service to create a router:

    In this example:

    • connection_router_service is an arbitrary name that is used to identify the new service.

    • readconnroute is the name of the module that implements the Read Connection Router.

    • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ES nodes.

    • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ES nodes.

    • router_options=slave sets the router_options parameter to slave, so that MaxScale only routes connections to the replica nodes.

    • --servers sets the servers parameter to the set of nodes to which MaxScale should route connections. All non-option arguments after --serversare interpreted as server names.

    • Other Module Parameters supported by readconnroute in MaxScale 25.01 can also be specified.

    Configure Listener for the Read Connection Router

    These instructions reference TCP port 3308. You can use a different TCP port. The TCP port used must not be bound by any other listener.

    On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read Connection Router (readconnroute):

    In this example:

    • connection_router_service is the name of the readconnroute service that was previously created.

    • connection_router_listener is an arbitrary name that is used to identify the new listener.

    • 3308 is the TCP port.

    • protocol=MariaDBClient sets the protocol parameter.

    • Other Module Parameters supported by listeners in MaxScale 25.01 can also be specified.

    Configure Read/Write Split Router for Queries

    MaxScale Read/Write Split Router (readwritesplit) performs query-based load balancing. The router routes write queries to the primary and read queries to the replicas.

    On the MaxScale node, use the maxctrl create service command to configure MaxScale to use the Read/Write Split Router (readwritesplit):

    In this example:

    • query_router_service is an arbitrary name that is used to identify the new service.

    • readwritesplit is the name of the module that implements the Read/Write Split Router.

    • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ES nodes.

    • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ES nodes.

    • --servers sets the servers parameter to the set of nodes to which MaxScale should route queries. All non-option arguments after --servers are interpreted as server names.

    • Other Module Parameters supported by readwritesplit in MaxScale 25.01 can also be specified.

    Configure a Listener for the Read/Write Split Router

    These instructions reference TCP port 3307. You can use a different TCP port. The TCP port used must not be bound by any other listener.

    On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read/Write Split Router (readwritesplit):

    In this example:

    • query_router_service is the name of the readwritesplit service that was previously created.

    • query_router_listener is an arbitrary name that is used to identify the new listener.

    • 3307 is the TCP port.

    • protocol=MariaDBClient sets the protocol parameter.

    • Other Module Parameters supported by listeners in MaxScale 25.01 can also be specified.

    Start Services

    To start the services and monitors, on the MaxScale node use maxctrl start services:

    Next Step

    Navigation in the procedure "Deploy Galera Cluster Topology":

    This page was step 5 of 6.

    Next: Step 6: Test MariaDB MaxScale

    Deploy Galera Cluster Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Replace the Default Configuration File

    MariaDB MaxScale installations include a configuration file with some example objects. This configuration file should be replaced.

    On the MaxScale node, replace the default /etc/maxscale.cnf with the following configuration:

    For additional information, see "Global Parameters".

    Restart MaxScale

    On the MaxScale node, restart the MaxScale service to ensure that MaxScale picks up the new configuration:

    For additional information, see "Start and Stop Services".

    Configure Server Objects

    On the MaxScale node, use maxctrl create to create a server object for each Enterprise ColumnStore node:

    Configure MariaDB Monitor

    MaxScale uses monitors to retrieve additional information from the servers. This information is used by other services in filtering and routing connections based on the current state of the node. For MariaDB Enterprise ColumnStore, use the MariaDB Monitor (mariadbmon).

    On the MaxScale node, use maxctrl create monitor to create a MariaDB Monitor:

    In this example:

    • columnstore_monitor is an arbitrary name that is used to identify the new monitor.

    • mariadbmon is the name of the module that implements the MariaDB Monitor.

    • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to monitor the ColumnStore nodes.

    • password='MAXSCALE_USER_PASSWORD' sets the password parameter to the password used by the database user account that MaxScale uses to monitor the ColumnStore nodes.

    • replication_user=REPLICATION_USER sets the replication_user parameter to the database user account that MaxScale uses to setup replication.

    • replication_password='REPLICATION_USER_PASSWORD' sets the replication_password parameter to the password used by the database user account that MaxScale uses to setup replication.

    • --servers sets the servers parameter to the set of nodes that MaxScale should monitor. All non-option arguments after --servers are interpreted as server names.

    • Other Module Parameters supported by mariadbmon in MaxScale 22.08 can also be specified.

    Choose a MaxScale Router

    Routers control how MaxScale balances the load between Enterprise ColumnStore nodes. Each router uses a different approach to routing queries. Consider the specific use case of your application and database load and select the router that best suits your needs.

    Router
    Configuration Procedure
    Description

    Connection-based load balancing

    • Routes connections to Enterprise ColumnStore nodes designated as replica servers for a read-only pool

    • Routes connections to an Enterprise ColumnStore node designated as the primary server for a read-write pool.

    Query-based load balancing

    • Routes write queries to an Enterprise ColumnStore node designated as the primary server

    • Routes read queries to Enterprise ColumnStore node designated as replica servers

    • Automatically reconnects after node failures

    • Automatically replays transactions after node failures

    Configure Read Connection Router

    Use MaxScale Read Connection Router (readconnroute) to route connections to replica servers for a read-only pool.

    On the MaxScale node, use maxctrl create service to create a router:

    In this example:

    • connection_router_service is an arbitrary name that is used to identify the new service.

    • readconnroute is the name of the module that implements the Read Connection Router.

    • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ColumnStore nodes.

    • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ColumnStore nodes.

    • router_options=slave sets the router_options parameter to slave, so that MaxScale only routes connections to the replica nodes.

    • --servers sets the servers parameter to the set of nodes to which MaxScale should route connections. All non-option arguments after --servers are interpreted as server names.

    • Other Module Parameters supported by readconnroute in MaxScale 22.08 can also be specified.

    Configure Listener for the Read Connection Router

    These instructions reference TCP port 3308. You can use a different TCP port. The TCP port used must not be bound by any other listener.

    On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read Connection Router (readconnroute):

    In this example:

    • connection_router_service is the name of the readconnroute service that was previously created.

    • connection_router_listener is an arbitrary name that is used to identify the new listener.

    • 3308 is the TCP port.

    • protocol=MariaDBClient sets the protocol parameter.

    • Other Module Parameters supported by listeners in MaxScale 22.08 can also be specified.

    Configure Read/Write Split Router for Queries

    MaxScale Read/Write Split Router (readwritesplit) performs query-based load balancing. The router routes write queries to the primary and read queries to the replicas.

    On the MaxScale node, use the maxctrl create service command to configure MaxScale to use the Read/Write Split Router (readwritesplit):

    In this example:

    • query_router_service is an arbitrary name that is used to identify the new service.

    • readwritesplit is the name of the module that implements the Read/Write Split Router.

    • user=MAXSCALE_USER sets the user parameter to the database user account that MaxScale uses to connect to the ColumnStore nodes.

    • password=MAXSCALE_USER_PASSWORD sets the password parameter to the password used by the database user account that MaxScale uses to connect to the ColumnStore nodes.

    • --servers sets the servers parameter to the set of nodes to which MaxScale should route queries. All non-option arguments after --servers are interpreted as server names.

    • Other Module Parameters supported by readwritesplit in MaxScale 22.08 can also be specified.

    Configure a Listener for the Read/Write Split Router

    These instructions reference TCP port 3307. You can use a different TCP port. The TCP port used must not be bound by any other listener.

    On the MaxScale node, use the maxctrl create listener command to configure MaxScale to use a listener for the Read/Write Split Router (readwritesplit):

    In this example:

    • query_router_service is the name of the readwritesplit service that was previously created.

    • query_router_listener is an arbitrary name that is used to identify the new listener.

    • 3307 is the TCP port.

    • protocol=MariaDBClient sets the protocol parameter.

    • Other Module Parameters supported by listeners in MaxScale 22.08 can also be specified.

    Start Services

    To start the services and monitors, on the MaxScale node use maxctrl start services:

    Next Step

    Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

    This page was step 7 of 9.

    Next: Next: Step 8: Test MariaDB MaxScale.

    Deploy ColumnStore Shared Local Storage Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    with MariaDB Enterprise Server 11.4 and MariaDB MaxScale 25.01.

    MariaDB Enterprise Cluster is powered by Galera.

    MariaDB Enterprise Cluster provides read scalability and fault tolerance through virtually synchronous multi-primary certification-based write-set replication (wsrep).

    This procedure has 6 steps, which are executed in sequence.

    MariaDB products can be deployed in many different topologies to suit specific use cases. Enterprise Cluster can be deployed on its own, or integrated with MariaDB Replication to integrate with other clusters or topologies.

    This procedure represents basic product capability with 3 Enterprise Cluster nodes and 1 MaxScale node.

    This page provides an overview of the topology, requirements, and deployment procedures.

    Please read and understand this procedure before executing.

    Procedure Steps

    Step
    Description

    Step 1

    Step 2

    Step 3

    Step 4

    Step 5

    Step 6

    Support

    Customers can obtain support by submitting a support case.

    Components

    The following components are deployed during this procedure:

    Component
    Function

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    Database proxy that extends the availability, scalability, and security of MariaDB Enterprise Servers

    MariaDB Enterprise Server Components

    Component
    Description

    MariaDB Enterprise Server leverages the Galera Enterprise 4 wsrep provider plugin

    • Provides virtually synchronous multi-primary replication for MariaDB Enterprise Server

    • All nodes can handle both reads and writes

    • Replicates write-sets to all other nodes in the cluster

    • Supports data-at-rest encryption of the write-set cache

    • General purpose storage engine

    • ACID-compliant

    • Performance

    • Required for Enterprise Cluster

    MariaDB MaxScale Components

    Component
    Description

    Galera Monitor

    Tracks changes in the state of MariaDB Enterprise Servers operating as Enterprise Cluster nodes.

    Listener

    Listens for client connections to MaxScale, then passes them to the router service associated with the listener

    Read Connection Router

    Routes connections from the listener to any available Enterprise Cluster node

    Read/Write Split Router

    Routes read operations from the listener to any available Enterprise Cluster node, and routes write operations from the listener to a specific server that MaxScale uses as the primary server

    Server Module

    Connection configuration in MaxScale to an Enterprise Cluster node

    Topology

    MariaDB Enterprise Cluster topology provides read scalability through certification-based write-set replication (wsrep) that is multi-primary and virtually synchronous.

    The Enterprise Cluster topology consists of:

    • 1 or more MaxScale nodes

    • 3 or more MariaDB Enterprise Servers (ES) configured as Enterprise Cluster nodes

    The MaxScale nodes:

    • Monitor the health and availability of each Enterprise Cluster node using the Galera Monitor (galeramon)

    • Accept client and application connections

    • Route queries to the Enterprise Cluster nodes using the Read Connection (readconnroute) or the Read/Write Split (readwritesplit) routers.

    The Enterprise Cluster nodes:

    • Receive queries from MaxScale

    • Store data locally using the InnoDB storage engine

    • Perform certification-based virtually synchronous replication to other Enterprise Cluster nodes

    • Provide State Snapshot Transfers (SST) to bring MariaDB Enterprise Server nodes into sync with the cluster

    Requirements

    These requirements are for the Galera Cluster topology when deployed with MariaDB Enterprise Server and MariaDB MaxScale 25.01.

    • Node Count

    • Operating System

    Node Count

    • MaxScale nodes, 1 or more are required.

    • Enterprise Cluster nodes, 3 or more are required.

    To avoid problems in establishing a quorum in the event of a network partition or outage, MariaDB recommends deploying an odd number of Enterprise Cluster nodes. When using multiple network switches, deploy across an odd number of switches, each with an odd number of nodes. When using multiple data centers, deploy across an odd number of data centers, each with an odd number of switches.

    Operating System

    In alignment to the enterprise lifecycle, the Galera Cluster topology with MariaDB Enterprise Server and MariaDB MaxScale 25.01 is provided for:

    • AlmaLinux 8 (x86_64, ARM64)

    • AlmaLinux 9 (x86_64, ARM64)

    • Debian 11 (x86_64, ARM64)

    • Debian 12 (x86_64, ARM64)

    • Red Hat Enterprise Linux 8 (x86_64, ARM64)

    • Red Hat Enterprise Linux 9 (x86_64, PPC64LE, ARM64)

    • Red Hat UBI 8 (x86_64, ARM64)

    • Rocky Linux 8 (x86_64, ARM64)

    • Rocky Linux 9 (x86_64, ARM64)

    • SUSE Linux Enterprise Server 15 (x86_64, ARM64)

    • Ubuntu 20.04 LTS (x86_64, ARM64)

    • Ubuntu 22.04 LTS (x86_64, ARM64)

    • Ubuntu 24.04 LTS (x86_64, ARM64)

    Quick Reference

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set system-variables and options. The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set system-variables and options.

    SQL

    Users can set system-variables that support dynamic changes on-the-fly using the SET statement.

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path
    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    • SUSE Linux Enterprise Server (SLES)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service. The galera_new_cluster and galera_recovery scripts are used for Enterprise Cluster-specific operations.

    Operation
    Command

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    For additional information, see "Starting and Stopping MariaDB".

    MariaDB Enterprise Server Logs

    MariaDB Enterprise Server produces log data that can be helpful in problem diagnosis.

    Log filenames and locations may be overridden in the server configuration. The default location of logs is the data directory. The data directory is specified by the datadir system variable.

    Log
    System Variable/Option
    Default Filename

    <hostname>.err

    server_audit.log

    <hostname>-slow.log

    MaxScale Configuration Management

    MaxScale can be configured using several methods. These methods make use of MaxScale's REST API.

    Method
    Benefits

    Command-line utility to perform administrative tasks through the REST API. See MaxCtrl Commands.

    MaxGUI is a graphical utility that can perform administrative tasks through the REST API.

    The REST API can be used directly. For example, the curl utility could be used to make REST API calls from the command-line. Many programming languages also have libraries to interact with REST APIs.

    The procedure on these pages configures MaxScale using MaxCtrl.

    MaxScale Service Management

    The systemctl command is used to start and stop the MaxScale service.>

    Operation
    Command

    Start

    sudo systemctl start maxscale

    Stop

    sudo systemctl stop maxscale

    Restart

    sudo systemctl restart maxscale

    Enable during startup

    sudo systemctl enable maxscale

    Disable during startup

    sudo systemctl disable maxscale

    Status

    sudo systemctl status maxscale

    For additional information, see "Starting and Stopping MariaDB".

    Next Step

    Navigation in the procedure "Deploy Galera Cluster Topology":

    Next: Step 1: Install MariaDB Enterprise Server

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Software Version

    Diagram

    Features

    • Enterprise Server 10.4

    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    Multi-Primary Cluster Powered by Galera for Transactional/OLTP Workloads

    • InnoDB Storage Engine

    • Highly available

    • Virtually synchronous, certification-based replication

    • Automated provisioning of new nodes (IST/SST)

    • Scales reads via MaxScale

    • Enterprise Server 10.3+, MariaDB Enterprise Cluster (powered by Galera), MaxScale 2.5+

    Stop the Enterprise Server Service

    The installation process might have started the Enterprise Server service. The service should be stopped prior to making configuration changes.

    Stop the MariaDB Enterprise Server service:

    Configure Enterprise Server

    Enterprise Server nodes require that you set the following system variables and options:

    System Variable/Option
    Description

    The network socket Enterprise Server listens on for incoming TCP/IP client connections. On Debian or Ubuntu, this system variable must be set to override the 127.0.0.1 default configuration.

    Set this option to the file you want to use for the Binary Log. Setting this option enables binary logging.

    Sets the numeric Server ID for this MariaDB Enterprise Server. The value set on this option must be unique to each node.

    MariaDB Enterprise Server also supports group commit.

    Group Commit

    Group commit can help performance by reducing I/O.

    If you would like to configure parallel replication on replica servers, then you must also configure group commit on the primary server.

    System Variable
    Description

    Sets the number of transactions that the server commits as a group to the binary log.

    Sets the number of microseconds that the server waits for transactions to group commit before it commits the current group.

    Example Configuration

    On each Enterprise Server node, edit a configuration file and set these system variables and options:

    Set the server_id option to a value that is unique for each Enterprise Server node.

    Start Primary Server

    Start MariaDB Enterprise Server. If the Enterprise Server process is already running, restart it to apply the changes from the configuration file.

    For additional information, see "Starting and Stopping MariaDB".

    Create User Accounts

    The Primary/Replica topology requires several user accounts. Each user account should be created on the primary server, so that it is replicated to the replica servers.

    Create the Replication User

    Primary/Replica uses MariaDB Replication to replicate writes between the primary and replica servers. As MaxScale can promote a replica server to become a new primary in the event of node failure, all nodes must have a replication user.

    The action is performed on the primary server.

    Create the replication user and grant it the required privileges:

    1. Use the CREATE USER statement to create replication user.

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect to the primary server from each replica.

    1. Grant the user account the required privileges with the GRANT statement.

    The following privileges are required:

    Use this username and password for the MASTER_USER and MASTER_PASSWORD in the CHANGE MASTER TO statement when configuring replica servers in Step 3.

    Create MaxScale User

    Primary/Replica uses MariaDB MaxScale 25.01 to load balance between the nodes. MaxScale requires a database user to connect to the primary server when routing queries and to promote replicas in the event that the primary server fails.

    This action is performed on the primary server.

    1. Use the CREATE USER statement to create the MaxScale user:

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect from the IP address of the MaxScale instance.

    1. Use the GRANT statement to grant the privileges required by the router:

    1. Use the GRANT statement to grant privileges required by the MariaDB Monitor.

    The following privileges are required:

    Next Step

    Navigation in the procedure "Deploy Primary/Replica Topology":

    This page was step 2 of 7.

    Next: Step 3: Start and Configure MariaDB Enterprise Server on Replica Servers

    Deploy Primary/Replica Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    MariaDB Enterprise Spider:
    • Supports a MariaDB foreign data wrapper. The MariaDB foreign data wrapper can be used to replace the older Federated and FederatedX storage engines.

    • Supports an ODBC foreign data wrapper in MariaDB Enterprise Server 10.5 and later. The maturity can be confirmed by querying the information_schema.SPIDER_WRAPPER_PROTOCOLS table.

    The Spider ODBC topology:

    • Can be used to query ODBC Data Sources from the Spider Node using the ODBC foreign data wrapper.

    • Can be used to join ODBC Data Sources with tables on the Spider Node using the ODBC foreign data wrapper.

    • Can be used to migrate table data from ODBC Data Sources to the Spider Node using the ODBC foreign data wrapper.

    ODBC MariaDB Enterprise Spider Topology

    In the Spider ODBC topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When the Spider Table is queried in this topology, the Enterprise Spider storage engine uses an ODBC foreign data wrapper to read from and write to an ODBC Data Source.

    MariaDB Enterprise Spider implemented support for the ODBC foreign data wrapper in MariaDB Enterprise Server 10.5.

    The maturity can be confirmed by querying the information_schema.SPIDER_WRAPPER_PROTOCOLS table.

    The Spider ODBC topology consists of:

    • One MariaDB Enterprise Server node is a Spider Node

    • One ODBC Data Source stores data for Spider Tables

    The Spider Node:

    • Contains one or more Spider Tables

    • Uses the Enterprise Spider storage engine plugin for Spider Tables

    • Uses an ODBC foreign data wrapper to query the ODBC Data Source

    The ODBC Data Source:

    • Contains the Data for each Spider Table

    • Can be a non-MariaDB database server, such as Microsoft SQL Server, Oracle, or PostgreSQL

    Term Definitions

    Term
    Definition

    Data Node

    A Data Node is a MariaDB Enterprise Server node that contains one or more Data Tables.

    Data Table

    A Data Table stores data for a Spider Table. When a Spider Table is queried, the Enterprise Spider storage engine uses the MariaDB foreign data wrapper to read from and write to the Data Table on a Data Node. The Data Table must be created on the Data Node with the same structure as the Spider Table. The Data Table must use a non-Spider storage engine, such as or .

    ODBC Data Source

    An ODBC Data Source relies on an ODBC Driver and an ODBC Driver Manager to query an external data source.

    ODBC Driver

    An ODBC Driver is a library that integrates with a ODBC Driver Manager to query an external data source.

    ODBC Driver Manager

    An ODBC Driver Manager allows applications to use ODBC Drivers.

    Spider Node

    A Spider Node is a MariaDB Enterprise Server node that contains one or more Spider Tables.

    Example Use Cases

    Query Non-MariaDB Databases

    The Spider ODBC topology can be used to query tables located on non-MariaDB databases:

    • The non-MariaDB database is configured as an ODBC Data Source in the ODBC Driver Manager.

    • The MariaDB Enterprise Server node that needs to query the ODBC Data Source is configured as a Spider Node.

    • A Spider Table is created on the Spider Node that references the ODBC Data Source.

    • On the Spider Node, the ODBC Data Source is queried by querying the Spider Table like the following:

    • Local tables can also be referenced in queries:

    Migrate Tables from Non-MariaDB Databases

    • The Spider ODBC topology can be used to migrate tables from a non-MariaDB database to a MariaDB Enterprise Server node:

    • The non-MariaDB database is configured as an ODBC Data Source in the ODBC Driver Manager.

    • The MariaDB Enterprise Server node with the destination table is configured as a Spider Node.

    • A Spider Table is created on the Spider Node that references the ODBC Data Source.

    • On the Spider Node, the ODBC Data Source's data is migrated to the destination table by querying the Spider Table like the following:

    Examples

    Load Spider with Configuration File (ES 10.4+)

    Load Spider with INSTALL SONAME (ES 10.4+)

    View Foreign Data Wrappers (ES 10.5+)

    Create ODBC Spider Table (with an Oracle remote server)

    Follow the link under Operations for further information on the setup.

    Resources

    Schema Design

    • Schema Design

    Operations

    • Use Spider ODBC to connect to Oracle

    Storage Engines

    • Enterprise Spider Storage Engine

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    MariaDB Client
    SELECT

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Step 3: Start and Configure MariaDB Enterprise Server on Replica Servers

    Overview

    This page details step 3 of the 7-step procedure "Deploy Primary/Replica Topology".

    This page starts and configures a MariaDB Enterprise Server 11.4 to operate as a replica server in MariaDB Replication.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Stop the Enterprise Server Service

    The installation process might have started the Enterprise Server service. The service should be stopped prior to making configuration changes.

    On each Enterprise Server node, stop the MariaDB Enterprise Server service:

    Configure Enterprise Server

    Enterprise Server nodes require that you set the following system variables and options:

    System Variable/Option
    Description

    MariaDB Enterprise Server also supports group commit.

    Parallel Replication

    Writes to the primary server that are group committed or logged with a Global Transaction ID in different replication domains can be applied on the replica server using parallel threads to improve performance.

    System Variable/Option
    Description

    Example Configuration

    On each Enterprise Server node, edit a configuration file and set these system variables and options:

    Set the server_id option to a value that is unique for each Enterprise Server node.

    Initialize Replica Database

    When deploying a new replica server to an existing system, back up the primary server and restore it on the replica server to initialize the database.

    Back up the Primary Server

    Use to back up the primary server.

    1. On the primary server, take a full backup:

    Confirm successful completion of the backup operation.

    1. On the primary server, prepare the backup:

    Confirm successful completion of the prepare operation.

    Restore the Backup to the Replica Server

    1. On the primary server, copy the backup directory to each replica server:

    1. On the replica server, move the default to another location:

    1. On the replica server, use to restore the backup to the :

    1. On the replica server, set the file permissions for the :

    Start Replica Server

    Start MariaDB Enterprise Server. If the Enterprise Server process is already running, restart it to apply the changes from the configuration file.

    For additional information, see "".

    Set the Global Transaction ID Position

    If the replica server was restored from a backup of the primary, set the GTID position.

    1. Get the GTID position that corresponds to the restored backup. This can be found in the xtrabackup_binlong_info file.

    The GTID position from the above output is 0-1-2001,1-2-5139.

    1. Connect to the replica server:

    Set the system variable to the GTID position:

    Start Replication

    1. Execute the CHANGE MASTER TO statement to configure the replica server to connect to the primary server at this position:

    The above statement configures the replica server to connect to a primary server located at 192.0.2.10 using the repl user account. This account must first be configured on the primary server.

    1. Use the statement to start replication:

    1. Use statement to confirm replication is running:

    Next Step

    Navigation in the procedure "Deploy Primary/Replica Topology":

    This page was step 3 of 7.

    Next: Step 4: Test MariaDB Enterprise Server

    Sharded MariaDB Enterprise Spider Topology

    Sharded MariaDB Enterprise Spider Topology

    Overview

    In the Sharded MariaDB Enterprise Spider topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried in this topology, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to Data Tables on Data Nodes. The data for the Spider Table is partitioned among the Data Nodes using the regular partitioning syntax.

    Benefits

    MariaDB Enterprise Spider:

    • Supports a MariaDB foreign data wrapper. The MariaDB foreign data wrapper can be used to replace the older Federated and FederatedX storage engines.

    • Supports an ODBC foreign data wrapper in MariaDB Enterprise Server 10.5 and later. The ODBC foreign data wrapper was backported to MariaDB Enterprise Server in a previous version. The ODBC foreign data wrapper is beta maturity. The maturity can be confirmed by querying the table.

    The Spider Sharded topology:

    • Can be used to consolidate multiple tables on multiple MariaDB Enterprise Server nodes into a single "virtual" table on the Spider Node using the MariaDB foreign data wrapper.

    • Can be used to partition a large table across multiple MariaDB Enterprise Server nodes for horizontal scalability using the MariaDB foreign data wrapper.

    • Defines Sharded Spider Tables with MariaDB Enterprise Server's regular partitioning syntax.

    Sharded MariaDB Enterprise Spider Topology

    In the Spider Sharded topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried in this topology, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to Data Tables on Data Nodes. The data for the Spider Table is partitioned among the Data Nodes using the regular partitioning syntax.

    The Spider Sharded topology consists of:

    • One MariaDB Enterprise Server node is a Spider Node

    • One or more MariaDB Enterprise Server nodes are Data Nodes

    The Spider Node:

    • Contains one or more partitioned Spider Tables

    • Uses the Enterprise Spider storage engine plugin for Spider Tables

    • Uses a MariaDB foreign data wrapper to query the Data Tables on the Data Nodes

    The Data Nodes:

    • Contain Data Tables for one or more partitions of the Spider Table

    • Use a non-Spider storage engine for each Data Table, such as InnoDB or ColumnStore

    Term Definitions

    Term
    Definition

    Example Use Cases

    Shard Big Tables

    The Spider Sharded topology can be used to split table data into multiple shards stored on remote MariaDB Enterprise Server nodes for horizontal scalability:

    • One MariaDB Enterprise Server node is configured as a Spider Node and accepts application queries.

    • One or more MariaDB Enterprise Server nodes are configured as Data Nodes and store shards.

    Consolidate Data for Multi-Location Businesses

    The Spider Sharded topology can be used to implement a consolidated view of multiple remote databases:

    • One MariaDB Enterprise Server is configured as a Spider Node and provides a consolidated view using Spider Tables.

    • One or more MariaDB Enterprise Server nodes are configured as Data Nodes and contain the local data.

    Examples

    Load Spider with Configuration File

    Load Spider with INSTALL SONAME

    View Foreign Data Wrappers (ES 10.5+)

    Create Sharded Spider Table

    Resources

    Deployment

    Schema Design

    Operations

    Storage Engines

    Step 1: Install Enterprise Spider

    Overview

    This page details step 1 of the 3-step procedure "Deploy Spider Sharded Topology".

    This step installs the Enterprise Spider storage engine plugin on the Spider Node.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Allow Interconnect

    MariaDB Enterprise Spider depends on interconnect between the Spider Node and all Data Nodes. This may require adjustment to firewall and security settings.

    Install Spider Package

    The plugin is not installed with MariaDB Enterprise Server by default. An additional package must be installed.

    Install via YUM (CentOS, RHEL)

    On the Spider Node, install MariaDB Enterprise Spider:

    Install via APT (Debian, Ubuntu)

    On the Spider Node, install MariaDB Enterprise Spider:

    Install via ZYpp (SLES)

    On the Spider Node, install MariaDB Enterprise Spider:

    Load the Spider Plugin

    The plugin must be loaded by MariaDB Enterprise Server

    On the Spider Node, use one of the following methods to configure MariaDB Enterprise Server to load the Enterprise Spider storage engine plugin:

    Interface
    Method
    Benefits

    Load Spider with Configuration File

    On the Spider Node, set the plugin_load_add option to ha_spider in a configuration file. The plugin_load_add option configures MariaDB Enterprise Server to load the Enterprise Spider storage engine plugin. The Spider Node must be restarted to detect the configuration change.

    1. Choose a configuration file for custom changes to system variables and options. It is not recommended to make custom changes to Enterprise Server's default configuration files, because your custom changes can be overwritten by other default configuration files that are loaded after. Ensure that your custom changes will be read last by creating a custom configuration file in one of the included directories. Configuration files in included directories are read in alphabetical order. Ensure that your custom configuration file is read last by using the z- prefix in the file name. Some example configuration file paths for different distributions are shown in the following table:

    Distributions
    Example configuration file path
    1. Set the plugin_load_add option in the configuration file. It must be set in a group that will be read by MariaDB Server, such as [mariadb] or [server]. For example:

    1. Restart MariaDB Enterprise Server:

    Load Spider with INSTALL SONAME

    On the Spider Node, execute the statement with the library name ha_spider. The INSTALL SONAME statement configures MariaDB Enterprise Server to load the Enterprise Spider storage engine plugin. The INSTALL SONAME statement requires the SUPER privilege.

    The INSTALL SONAME statement adds the Enterprise Spider storage engine to the system table. When the Spider Node is restarted, MariaDB Enterprise Server reads the system table and reloads the plugin, so the statement only needs to be executed once.

    1. Connect to the Spider Node using MariaDB Client:

    1. Use the INSTALL SONAME statement to install the Enterprise Spider storage engine plugin:

    Test Plugin Installation

    On the Spider Node, confirm that the Enterprise Spider storage engine plugin is loaded by querying the information_schema.PLUGINS table:

    When the Enterprise Spider storage engine is loaded, the PLUGIN_NAME column contains the value SPIDER and the PLUGIN_STATUS column contains the value ACTIVE.

    Next Step

    Navigation in the procedure "Deploy Spider Sharded Topology":

    This page was step 1 of 3.

    Next: Step 2: Configure Spider Node and Data Nodes.

    Spider Federated

    Deploy Spider Federated Topology

    Overview

    Software Version
    Diagram
    Features

    Spider Sharded

    Deploy Spider Sharded Topology

    Overview

    Software Version
    Diagram
    Features

    $ sudo systemctl stop mariadb
    [mariadb]
    bind_address             = 0.0.0.0
    binlog_format            = ROW
    innodb_autoinc_lock_mode = 2
    wsrep_cluster_address    = gcomm://192.0.2.101,192.0.2.102,192.0.2.103
    wsrep_cluster_name       = example-cluster
    wsrep_on                 = ON
    
    # wsrep provider path for Debian and Ubuntu:
    wsrep_provider = /usr/lib/galera/libgalera_enterprise_smm.so
    
    # wsrep provider path for CentOS, RHEL, and SLES:
    # wsrep_provider = /usr/lib64/galera/libgalera_enterprise_smm.so
    
    wsrep_provider_options = "gcache.size=2G;gcs.fc_limit=128"
    
    # TLS Configuration
    ssl_ca   = /path/to/ca-cert.pem
    ssl_cert = /path/to/sever-cert.pem
    ssl_key  = /path/to/server-key.pem
    $ sudo galera_new_cluster
    $ sudo mariadb
    SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';
    
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size |     1 |
    +--------------------+-------+
    $ sudo systemctl start mariadb
    $ sudo mariadb
    SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';
    
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size |     2 |
    +--------------------+-------+
    SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';
    
    +---------------------------+--------+
    | Variable_name             | Value  |
    +---------------------------+--------+
    | wsrep_local_state_comment | Synced |
    +---------------------------+--------+
    [maxscale]
    threads          = auto
    admin_host       = 0.0.0.0
    admin_secure_gui = false
    $ sudo systemctl restart maxscale
    CREATE USER mxs@192.0.2.104 IDENTIFIED BY "passwd";
    GRANT SHOW DATABASES ON *.* TO mxs@192.0.2.104;
    GRANT SELECT ON mysql.columns_priv TO mxs@192.0.2.104;
    GRANT SELECT ON mysql.db TO mxs@192.0.2.104;
    GRANT SELECT ON mysql.procs_priv TO mxs@192.0.2.104;
    GRANT SELECT ON mysql.proxies_priv TO mxs@192.0.2.104;
    GRANT SELECT ON mysql.roles_mapping TO mxs@192.0.2.104;
    GRANT SELECT ON mysql.tables_priv TO mxs@192.0.2.104;
    GRANT SELECT ON mysql.user TO mxs@192.0.2.104;
    $ maxctrl create server node1 192.0.2.101
    
    $ maxctrl create server node2 192.0.2.102
    
    $ maxctrl create server node3 192.0.2.103
    $ maxctrl create monitor cluster_monitor galeramon \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         --servers node1 node2 node3
    $ maxctrl create service connection_router_service readconnroute \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         router_options=slave \
         --servers node1 node2 node3
    $ maxctrl create listener connection_router_service connection_router_listener 3308 \
         protocol=MariaDBClient
    $ maxctrl create service query_router_service readwritesplit  \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         --servers node1 node2 node3
    $ maxctrl create listener query_router_service query_router_listener 3307 \
         protocol=MariaDBClient
    $ maxctrl start services
    [maxscale]
    threads          = auto
    admin_host       = 0.0.0.0
    admin_secure_gui = false
    $ sudo systemctl restart maxscale
    $ maxctrl create server mcs1 192.0.2.101
    $ maxctrl create server mcs2 192.0.2.102
    $ maxctrl create server mcs3 192.0.2.103
    $ maxctrl create monitor columnstore_monitor mariadbmon \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         replication_user=repl \
         replication_password='REPLICATION_USER_PASSWORD' \
         --servers mcs1 mcs2 mcs3
    $ maxctrl create service connection_router_service readconnroute \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         router_options=slave \
         --servers mcs1 mcs2 mcs3
    $ maxctrl create listener connection_router_service connection_router_listener 3308 \
         protocol=MariaDBClient
    $ maxctrl create service query_router_service readwritesplit  \
         user=mxs \
         password='MAXSCALE_USER_PASSWORD' \
         --servers mcs1 mcs2 mcs3
    $ maxctrl create listener query_router_service query_router_listener 3307 \
         protocol=MariaDBClient
    $ maxctrl start services
    $ sudo systemctl stop mariadb
    [mariadb]
    bind_address = 0.0.0.0
    log_bin      = mariadb-bin.log
    server_id    = 1
    $ systemctl start mariadb
    CREATE USER 'repl'@'192.0.2.%' IDENTIFIED BY 'repl_passwd';
    GRANT REPLICATION SLAVE,
       REPLICATION CLIENT
    ON *.* TO repl@'%';
    CREATE USER 'mxs'@'192.0.2.%'
    IDENTIFIED BY 'mxs_passwd';
    GRANT SHOW DATABASES ON *.* TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.columns_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.db TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.procs_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.proxies_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.roles_mapping TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.tables_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.user TO 'mxs'@'192.0.2.%';
    GRANT SUPER,
       REPLICATION CLIENT,
       RELOAD,
       PROCESS,
       SHOW DATABASES,
       EVENT
    ON *.* TO 'mxs'@'192.0.2.%';
    SELECT * FROM spider_tab;
    [mariadb]
    ...
    plugin_load_add = "ha_spider"
    INSTALL SONAME "ha_spider";
    SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS;
    INSTALL SONAME 'ha_spider';
    CREATE DATABASE spider_test;
    USE spider_test;
    CREATE OR REPLACE TABLE contacts (
        contact_id  BIGINT NOT NULL PRIMARY KEY,
        first_name  VARCHAR(255) NOT NULL,
        last_name   VARCHAR(255) NOT NULL,
        email       VARCHAR(255) NOT NULL,
        phone       VARCHAR(20),
        customer_id BIGINT
    ) ENGINE=SPIDER COMMENT='wrapper "odbc", dsn "ORARDS", table "CONTACTS"';
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SHOW GLOBAL STATUS LIKE 'wsrep_cluster_status';
    
    +----------------------+---------+
    | Variable_name        | Value   |
    +----------------------+---------+
    | wsrep_cluster_status | Primary |
    +----------------------+---------+
    SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';
    
    +--------------------+---------+
    | Variable_name      | Value   |
    +--------------------+---------+
    | wsrep_cluster_size |       3 |
    +--------------------+---------+
    $ sudo mariadb
    CREATE DATABASE IF NOT EXISTS test;
    
    CREATE TABLE test.contacts (
       id INT PRIMARY KEY AUTO_INCREMENT,
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    );
    $ sudo mariadb
    SHOW CREATE TABLE test.contacts\G;
    $ sudo mariadb
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    $ sudo mariadb
    SELECT * FROM test.contacts;
    
    +----+------------+-----------+----------------------+
    | id | first_name | last_name | email                |
    +----+------------+-----------+----------------------+
    | 1  | Kai        | Devi      | kai.devi@example.com |
    | 2  | Lee        | Wang      | lee.wang@example.com |
    +----+------------+-----------+----------------------+
    Read Connection (readconnroute)
    Read/Write Split (readwritesplit)
  • Optionally enforces causal reads

  • Read Connection (readconnroute)
    Configure Read Connection Router
    Read/Write Split (readwritesplit)
    Configure Read/Write Split
    bind_address
    log_bin
    server_id
    binlog_commit_wait_count
    binlog_commit_wait_usec

    Spider Table

    A Spider Table is a virtual table that does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses foreign data wrappers to read from and write to Data Tables on Data Nodes or ODBC Data Sources.

    InnoDB
    ColumnStore

    bind_address

    The network socket Enterprise Server listens on for incoming TCP/IP client connections. On Debian or Ubuntu, this system variable must be set to override the 127.0.0.1 default configuration.

    log_bin

    Enables binary logging and sets the name of the binlog file.

    server_id

    Unique numeric identifier for each Enterprise Server node.

    slave_parallel_threads

    Sets the number of threads the replica server uses to apply replication events in parallel. Use a non-zero value to enable Parallel Replication.

    slave_parallel_mode

    Sets how the replica server applies replicated transactions.

    MariaDB Backup
    datadir
    MariaDB Backup
    datadir
    datadir
    Starting and Stopping MariaDB
    gtid_slave_pos
    START REPLICA
    SHOW REPLICA STATUS

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Shell

    Configuration File

    • SQL access is not required

    • SUPER privilege is not required

    • Configuration file can be version controlled

    SQL

    INSTALL SONAME Statement

    • Shell access is not required

    • File system privileges on configuration file are not required

    • Plugin is included in backup of mysql.plugin system table

    • Spider Node restart is not required

    • CentOS

    • RHEL

    • Rocky Linux

    • SLES

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    Enterprise Spider storage engine
    Enterprise Spider storage engine
    INSTALL SONAME
    mysql.plugin

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    SELECT *
    FROM spider_tab s
    JOIN local_tab l
    ON s.id=l.id;
    INSERT INTO destination_tab
    SELECT * FROM spider_tab;
    $ sudo systemctl stop mariadb
    [mariadb]
    bind_address = 0.0.0.0
    log_bin      = mariadb-bin.log
    server_id    = 1
    $ sudo mariadb-backup --backup \
          --user=mariadb-backup_user \
          --password=mariadb-backup_passwd \
          --target-dir=/data/backup/replica_backup
    $ sudo mariadb-backup --prepare \
          --target-dir=/data/backup/replica_backup
    $ sudo rsync -av /data/backup/replica_backup 192.0.2.11:/data/backup/
    $ sudo mv /var/lib/mysql /var/lib/mysql_backup
    $ sudo mariadb-backup --copy-back \
       --target-dir=/data/backup/replica_backup
    $ sudo chown -R mysql:mysql /var/lib/mysql
    $ systemctl start mariadb
    $ cat xtrabackup_binlog_info
    mariadb-bin.000096 568 0-1-2001,1-2-5139
    $ sudo mariadb
    SET GLOBAL gtid_slave_pos='0-1-2001,1-2-5139';
    CHANGE MASTER TO
       MASTER_USER = "repl",
       MASTER_HOST = "192.0.2.10",
       MASTER_PASSWORD = "repl_passwd",
       MASTER_USE_GTID = slave_pos;
    START REPLICA;
    SHOW REPLICA STATUS\G
    
    *************************** 1. row ***************************
                    Slave_IO_State: Waiting for master to send event
                       Master_Host: 192.0.2.10
                       Master_User: repl
                       Master_Port: 3306
                     Connect_Retry: 60
                   Master_Log_File: mariadb-bin.000001
               Read_Master_Log_Pos: 645
                    Relay_Log_File: li282-189-relay-bin.000002
                     Relay_Log_Pos: 946
             Relay_Master_Log_File: mariadb-bin.000001
                  Slave_IO_Running: Yes
                 Slave_SQL_Running: Yes
                   Replicate_Do_DB:
               Replicate_Ignore_DB:
                Replicate_Do_Table:
            Replicate_Ignore_Table:
           Replicate_Wild_Do_Table:
       Replicate_Wild_Ignore_Table:
                        Last_Errno: 0
                        Last_Error:
                      Skip_Counter: 0
               Exec_Master_Log_Pos: 645
                   Relay_Log_Space: 1259
                   Until_Condition: None
                    Until_Log_File:
                     Until_Log_Pos: 0
                Master_SSL_Allowed: No
                Master_SSL_CA_File:
                Master_SSL_CA_Path:
                   Master_SSL_Cert:
                 Master_SSL_Cipher:
                    Master_SSL_Key:
             Seconds_Behind_Master: 0
     Master_SSL_Verify_Server_Cert: No
                     Last_IO_Errno: 0
                     Last_IO_Error:
                    Last_SQL_Errno: 0
                    Last_SQL_Error:
       Replicate_Ignore_Server_Ids:
                  Master_Server_Id: 1
                    Master_SSL_Crl:
                Master_SSL_Crlpath:
                        Using_Gtid: Slave_Pos
                       Gtid_IO_Pos: 0-1-2
           Replicate_Do_Domain_Ids:
       Replicate_Ignore_Domain_Ids:
                     Parallel_Mode: optimistic
                         SQL_Delay: 0
               SQL_Remaining_Delay: NULL
           Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                  Slave_DDL_Groups: 2
    Slave_Non_Transactional_Groups: 0
        Slave_Transactional_Groups: 0
    $ sudo yum install MariaDB-spider-engine
    $ sudo apt install mariadb-plugin-spider
    $ sudo zypper install MariaDB-spider-engine
    [mariadb]
    ...
    plugin_load_add = "ha_spider"
    $ sudo systemctl restart mariadb
    $ sudo mariadb
    INSTALL SONAME "ha_spider";
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE "ha_spider%";
    
    +--------------------------+---------------+
    | PLUGIN_NAME              | PLUGIN_STATUS |
    +--------------------------+---------------+
    | SPIDER                   | ACTIVE        |
    | SPIDER_ALLOC_MEM         | ACTIVE        |
    | SPIDER_WRAPPER_PROTOCOLS | ACTIVE        |
    +--------------------------+---------------+

    A Spider Table is a virtual table that does not store data. When a Spider Table is queried, the uses foreign data wrappers to read from and write to Data Tables on Data Nodes or ODBC Data Sources.

    Data Node

    A Data Node is a MariaDB Enterprise Server node that contains one or more Data Tables.

    Data Table

    A Data Table stores data for a Spider Table. When a Spider Table is queried, the Enterprise Spider storage engine uses the MariaDB foreign data wrapper to read from and write to the Data Table on a Data Node. The Data Table must be created on the Data Node with the same structure as the Spider Table. The Data Table must use a non-Spider storage engine, such as InnoDB or ColumnStore.

    ODBC Data Source

    An ODBC Data Source relies on an ODBC Driver and an ODBC Driver Manager to query an external data source.

    ODBC Driver

    An ODBC Driver is a library that integrates with a ODBC Driver Manager to query an external data source.

    ODBC Driver Manager

    An ODBC Driver Manager allows applications to use ODBC Drivers.

    Spider Node

    A Spider Node is a MariaDB Enterprise Server node that contains one or more Spider Tables.

    information_schema.SPIDER_WRAPPER_PROTOCOLS
    Schema Design
    Operations
    Add a Shard
    Backup and Restore
    Enterprise Spider Storage Engine

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Spider Table

    This procedure describes the deployment of the Spider Federated topology with MariaDB Enterprise Server

    This procedure incrementally deploys MariaDB Enterprise Spider on an existing MariaDB Enterprise Server deployment.

    In the Spider Federated topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to a Data Table on a Data Node.

    This procedure has 3 steps, which are executed in sequence.

    This page provides an overview of the topology, requirements, and deployment procedure.

    The topology described is representative of basic product capabilities. MariaDB products can be deployed to form other topologies, leverage advanced product capabilities, or combine the capabilities of multiple topologies.

    Prerequisites

    If you have not yet deployed MariaDB Enterprise Server on the Spider Node and Data Node, first deploy a topology containing MariaDB Enterprise Server. Several topologies are documented.

    Procedure Steps

    Step
    Description

    Step 1

    Step 2

    Step 3

    Support

    Customers can obtain support by submitting a support case.

    Components

    The following components are deployed during this procedure:

    Component
    Function

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    Storage engine used by Spider Tables to read from and write to Data Tables using the MariaDB foreign data wrapper.

    Term Definitions

    Term
    Definition

    Data Node

    A Data Node is a MariaDB Enterprise Server node that contains one or more Data Tables.

    Data Table

    A Data Table stores data for a Spider Table. When a Spider Table is queried, the Enterprise Spider storage engine uses the MariaDB foreign data wrapper to read from and write to the Data Table on a Data Node. The Data Table must be created on the Data Node with the same structure as the Spider Table. The Data Table must use a non-Spider storage engine, such as or .

    ODBC Data Source

    An ODBC Data Source relies on an ODBC Driver and an ODBC Driver Manager to query an external data source.

    ODBC Driver

    An ODBC Driver is a library that integrates with a ODBC Driver Manager to query an external data source.

    ODBC Driver Manager

    An ODBC Driver Manager allows applications to use ODBC Drivers.

    Spider Node

    A Spider Node is a MariaDB Enterprise Server node that contains one or more Spider Tables.

    Topology

    In the Spider Federated topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to a Data Table on a Data Node.

    The Spider Federated topology consists of:

    • One MariaDB Enterprise Server node is a Spider Node

    • One MariaDB Enterprise Server node is a Data Node

    The Spider Node:

    • Contains one or more Spider Tables

    • Uses the Enterprise Spider storage engine plugin for Spider Tables

    • Uses a MariaDB foreign data wrapper to query the Data Table on the Data Node

    The Data Node:

    • Contains a Data Table for each Spider Table

    • Uses a non-Spider storage engine for each Data Table, such as InnoDB or ColumnStore

    For additional information, see "Spider Federated Topology Operations".

    Requirements

    These requirements are for the Spider Federated topology when deployed with MariaDB Enterprise Server

    • Node Count

    • Operating Systems

    Node Count

    • One or more MariaDB Enterprise Server nodes must be deployed as Spider Nodes. The Spider Nodes contain Spider Tables.

    • One or more MariaDB Enterprise Server nodes must be deployed as Data Nodes. The Data Nodes contain Data Tables.

    Operating Systems

    In alignment to the , the Spider Federated topology with MariaDB Enterprise Server is provided for:

    • AlmaLinux 8 (x86_64, ARM64)

    • AlmaLinux 9 (x86_64, ARM64)

    • Debian 11 (x86_64, ARM64)

    • Debian 12 (x86_64, ARM64)

    • Microsoft Windows (x86_64)

    • Red Hat Enterprise Linux 8 (x86_64, ARM64)

    • Red Hat Enterprise Linux 9 (x86_64, PPC64LE, ARM64)

    • Red Hat UBI 8 (x86_64, ARM64)

    • Rocky Linux 8 (x86_64, ARM64)

    • Rocky Linux 9 (x86_64, ARM64)

    • SUSE Linux Enterprise Server 15 (x86_64, ARM64)

    • Ubuntu 20.04 LTS (x86_64, ARM64)

    • Ubuntu 22.04 LTS (x86_64, ARM64)

    • Ubuntu 24.04 LTS (x86_64, ARM64)

    Next Step

    Navigation in the procedure "Deploy Spider Federated Topology":

    Next: Step 1: Install Enterprise Spider

    • Enterprise Server 10.4

    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    Read from and write to tables on remote ES nodes

    • Spider Node uses Spider storage engine for Federated Spider Tables

    • Federated Spider Table is a "virtual" table

    • Spider uses MariaDB foreign data wrapper to query Data Table on Data Node

    • Data Node uses non-Spider storage engine for Data Tables

    • Supports transactions

    • Enterprise Server 10.3+, Enterprise Spider

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This procedure describes the deployment of the Spider Sharded topology with MariaDB Enterprise Server.

    This procedure incrementally deploys MariaDB Enterprise Spider on an existing MariaDB Enterprise Server deployment.

    In the Spider Sharded topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried in this topology, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to Data Tables on Data Nodes. The data for the Spider Table is partitioned among the Data Nodes using the regular partitioning syntax.

    This procedure has 3 steps, which are executed in sequence.

    This page provides an overview of the topology, requirements, and deployment procedure.

    The topology described is representative of basic product capabilities. MariaDB products can be deployed to form other topologies, leverage advanced product capabilities, or combine the capabilities of multiple topologies.

    Prerequisites

    If you have not yet deployed MariaDB Enterprise Server on the Spider Node and Data Nodes, first deploy a topology containing MariaDB Enterprise Server. Several topologies are documented.

    Procedure Steps

    Step
    Description

    Step 1

    Step 2

    Step 3

    Support

    Customers can obtain support by submitting a support case.

    Components

    The following components are deployed during this procedure:

    Component
    Function

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    Storage engine used by Spider Tables to read from and write to Data Tables using the MariaDB foreign data wrapper.

    Term Definitions

    Term
    Definition

    Data Node

    A Data Node is a MariaDB Enterprise Server node that contains one or more Data Tables.

    Data Table

    A Data Table stores data for a Spider Table. When a Spider Table is queried, the Enterprise Spider storage engine uses the MariaDB foreign data wrapper to read from and write to the Data Table on a Data Node. The Data Table must be created on the Data Node with the same structure as the Spider Table. The Data Table must use a non-Spider storage engine, such as or .

    ODBC Data Source

    An ODBC Data Source relies on an ODBC Driver and an ODBC Driver Manager to query an external data source.

    ODBC Driver

    An ODBC Driver is a library that integrates with a ODBC Driver Manager to query an external data source.

    ODBC Driver Manager

    An ODBC Driver Manager allows applications to use ODBC Drivers.

    Spider Node

    A Spider Node is a MariaDB Enterprise Server node that contains one or more Spider Tables.

    Topology

    In the Spider Sharded topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to Data Tables on Data Nodes. The data for the Spider Table is partitioned among the Data Nodes using the regular partitioning syntax.

    The Spider Sharded topology consists of:

    • One MariaDB Enterprise Server node is a Spider Node

    • One or more MariaDB Enterprise Server nodes are Data Nodes

    The Spider Node:

    • Contains one or more Spider Tables

    • Uses the Enterprise Spider storage engine plugin for Spider Tables

    • Uses a MariaDB foreign data wrapper to query the Data Tables on the Data Nodes

    The Data Nodes:

    • Contain Data Tables for one or more partitions of the Spider Table

    • Uses a non-Spider storage engine for each Data Table, such as InnoDB or ColumnStore

    For additional information, see "Spider Sharded Topology".

    Requirements

    These requirements are for the Spider Sharded topology when deployed with MariaDB Enterprise Server

    • Node Count

    • Operating Systems

    Node Count

    • One or more MariaDB Enterprise Server nodes must be deployed as Spider Nodes. The Spider Nodes contain Spider Tables.

    • One or more MariaDB Enterprise Server nodes must be deployed as Data Nodes. The Data Nodes contain Data Tables.

    Operating Systems

    In alignment to the , the Spider Sharded topology with MariaDB Enterprise Server is provided for:

    • AlmaLinux 8 (x86_64, ARM64)

    • AlmaLinux 9 (x86_64, ARM64)

    • Debian 11 (x86_64, ARM64)

    • Debian 12 (x86_64, ARM64)

    • Microsoft Windows (x86_64)

    • Red Hat Enterprise Linux 8 (x86_64, ARM64)

    • Red Hat Enterprise Linux 9 (x86_64, PPC64LE, ARM64)

    • Red Hat UBI 8 (x86_64, ARM64)

    • Rocky Linux 8 (x86_64, ARM64)

    • Rocky Linux 9 (x86_64, ARM64)

    • SUSE Linux Enterprise Server 15 (x86_64, ARM64)

    • Ubuntu 20.04 LTS (x86_64, ARM64)

    • Ubuntu 22.04 LTS (x86_64, ARM64)

    • Ubuntu 24.04 LTS (x86_64, ARM64)

    Next Step

    Navigation in the procedure "Deploy Spider Sharded Topology":

    Next: Step 1: Install Enterprise Spider

    • Enterprise Server 10.4

    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    Shard tables for horizontal scalability

    • Spider Node uses Spider storage engine for Sharded Spider Tables

    • Sharded Spider Table is a partitioned "virtual" table

    • Spider uses MariaDB foreign data wrapper to query Data Tables on Data Nodes for each partition

    • Data Node uses non-Spider storage engine for Data Tables

    • Supports transactions

    • Enterprise Server 10.3+, Enterprise Spider

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Bootstrap a cluster node

    sudo galera_new_cluster

    Recover a cluster node's position

    sudo galera_recovery

    <hostname>.log

    Binary Log

    log_bin

    <hostname>-bin

    Install MariaDB Enterprise Server
    Start and Configure MariaDB Enterprise Server
    Test MariaDB Enterprise Server
    Install MariaDB MaxScale
    Start and Configure MariaDB MaxScale
    Test MariaDB MaxScale
    MariaDB Enterprise Server
    InnoDB
    MariaDB Error Log
    log_error
    MariaDB Enterprise Audit Log
    server_audit_file_path
    Slow Query Log
    slow_query_log_file
    General Query Log
    general_log_file
    MaxCtrl
    MaxGUI
    REST API
    MariaDB MaxScale 25.01
    Enterprise Cluster

    Step 4: Test MariaDB Enterprise Server

    Overview

    This page details step 4 of the 4-step procedure "Deploy HTAP Topology".

    This step tests Enterprise ColumnStore.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Test S3 Connection

    MariaDB Enterprise ColumnStore includes a testS3Connection command to test the S3 configuration, permissions, and connectivity.

    Test the S3 configuration by executing the following:

    If the testS3Connection command does not return OK, investigate the S3 configuration.

    Test Enterprise Server Service

    Use Systemd to test whether the MariaDB Enterprise Server service is running.

    Check if the MariaDB Enterprise Server service is running by executing the following:

    If the service is not running, start the service by executing the following:

    Test Local Client Connections

    Use MariaDB Client to test the local connection to the Enterprise Server node:

    The sudo command is used here to connect to the Enterprise Server node using the root@localhost user account, which authenticates using the unix_socket authentication plugin. Other user accounts can be used by specifying the --user and --password command-line options.

    Test ColumnStore Storage Engine Plugin

    Query the table to confirm that the ColumnStore storage engine is loaded.

    Execute the following query:

    The PLUGIN_STATUS column for each ColumnStore-related plugin should contain ACTIVE.

    Test Replication Status

    Use the statement to check the status of MariaDB Replication:

    Test ColumnStore Table Creation

    1. Create a test database, if it does not exist:

    1. Create a ColumnStore table:

    1. Add sample data into the table:

    1. Read data from table:

    Test Cross Engine Join

    1. Create an InnoDB table:

    1. Add data to the table:

    1. Perform a cross-engine join:

    Test HTAP Replication

    1. Connect to the server using using the root@localhost user account:

    1. Create the databases for the InnoDB and ColumnStore tables using the CREATE DATABASE statement:

    1. Create the InnoDB versions of the HTAP tables using the CREATE TABLE statement:

    1. Confirm that the tables were replicated using the SHOW TABLES statement:

    1. The replication initially creates empty InnoDB tables, which need to be transformed into ColumnStore tables and which need to be populated with the initial copy of the data:

    1. Insert data into the InnoDB versions of the HTAP tables using the statement:

    1. Confirm that the data was replicated using the statement:

    1. Create an InnoDB table that will not be replicated:

    1. Confirm that the table was not replicated:

    1. Create a ColumnStore table that will not be replicated:

    1. Confirm that the table was not replicated:

    Next Step

    Navigation in the procedure "Deploy HTAP Topology". This page was step 4 of 4.

    This procedure is complete.

    Step 3: Start and Configure MariaDB Enterprise Server

    Overview

    This page details step 3 of the 4-step procedure "Deploy HTAP Topology".

    This step starts and configures MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Stop the Enterprise ColumnStore Services

    The installation process might have started some of the ColumnStore services. The services should be stopped prior to making configuration changes.

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise Server service:

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise ColumnStore service:

    1. On each Enterprise ColumnStore node, stop the CMAPI service:

    Configure Enterprise ColumnStore

    On each Enterprise ColumnStore node, configure Enterprise Server.

    Connector
    MariaDB Connector/R2DBC

    Example Configuration

    Configure the S3 Storage Manager

    Configure Enterprise ColumnStore S3 Storage Manager to use S3-compatible storage by editing the /etc/columnstore/storagemanager.cnf configuration file:

    The S3-compatible object storage options are configured under [S3]:

    • The bucket option must be set to the name of the bucket that you created in "Create an S3 Bucket".

    • The endpoint option must be set to the endpoint for the S3-compatible object storage.

    • The aws_access_key_id and aws_secret_access_key options must be set to the access key ID and secret access key for the S3-compatible object storage.

    • To use a specific IAM role, you must uncomment and set

    The local cache options are configured under [Cache]:

    • The cache_size option is set to 2 GB by default.

    • The path option is set to /var/lib/columnstore/storagemanager/cache by default.

    • Ensure that the specified path has sufficient storage space for the specified cache size.

    Start the Enterprise ColumnStore Services

    Start and enable the MariaDB Enterprise Server service, so that it starts automatically upon reboot:

    Start and enable the MariaDB Enterprise ColumnStore service, so that it starts automatically upon reboot:

    For additional information, see "".

    Create User Accounts

    The HTAP topology requires several user accounts.

    Create the Utility User

    Enterprise ColumnStore requires a mandatory utility user account. By default, it connects to the server using the root user with no password. MariaDB Enterprise Server 10.6 will reject this login attempt by default, so you will need to configure Enterprise ColumnStore to use a different user account and password and create this user account on Enterprise Server.

    1. On the Enterprise ColumnStore node, create the user account with the CREATE USER statement:

    1. On the Enterprise ColumnStore node, grant the user account SELECT privileges on all databases with the GRANT statement:

    1. Configure Enterprise ColumnStore to use the utility user:

    1. Set the password:

    For details about how to encrypt the password, see "".

    Passwords should meet your organization's password policies. If your MariaDB Enterprise Server instance has a password validation plugin installed, then the password should also meet the configured requirements.

    Create the Replication User

    Enterprise HTAP uses to replicate writes between InnoDB tables and ColumnStore tables.

    Create a replication user and grant it the required privileges:

    1. Use the statement to create replication users for each replica server:

    1. Grant the user account several global privileges with the statement.

    Configure MariaDB Replication

    1. Set the GTID position by setting the system variable. If this is a new deployment, then it would be set to the empty string:

    1. Use the CHANGE MASTER TO statement to configure the server to replicate from itself starting from this position:

    1. Start replication using the START REPLICA statement:

    1. Confirm that replication is working using the SHOW REPLICA STATUS statement:

    Configure Linux Security Modules (LSM)

    The specific steps to configure the security module depend on the operating system.

    Configure SELinux (CentOS, RHEL)

    Configure SELinux for Enterprise ColumnStore:

    1. To configure SELinux, you have to install the packages required for audit2allow. On CentOS 7 and RHEL 7, install the following:

    On RHEL 8, install the following:

    1. Allow the system to run under load for a while to generate SELinux audit events.

    2. After the system has taken some load, generate an SELinux policy from the audit events using audit2allow:

    If no audit events were found, this will print the following:

    1. If audit events were found, the new SELinux policy can be loaded using semodule:

    1. Set SELinux to enforcing mode by setting SELINUX=enforcing in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Set SELinux to enforcing mode:

    Configure AppArmor (Ubuntu)

    For information on how to create a profile, see on ubuntu.com.

    Next Step

    Navigation in the procedure "Deploy HTAP Topology".

    This page was step 3 of 4.

    Next: Step 4: Test MariaDB Enterprise Server.

    Step 3: Start and Configure Enterprise ColumnStore

    Overview

    This page details step 3 of a 5-step procedure for deploying Single-Node Enterprise ColumnStore with Object storage.

    This step starts and configures MariaDB Enterprise Server and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Configure Enterprise ColumnStore

    Mandatory system variables and options for Single-Node Enterprise ColumnStore include:

    Connector
    MariaDB Connector/R2DBC

    Example Configuration

    Configure the S3 Storage Manager

    Configure Enterprise ColumnStore S3 Storage Manager to use S3-compatible storage by editing the /etc/columnstore/storagemanager.cnf configuration file:

    The S3-compatible object storage options are configured under [S3]:

    • The bucket option must be set to the name of the bucket that you created in "".

    • The endpoint option must be set to the endpoint for the S3-compatible object storage.

    • The aws_access_key_id and aws_secret_access_key options must be set to the access key ID and secret access key for the S3-compatible object storage.

    The local cache options are configured under [Cache]:

    • The cache_size option is set to 2 GB by default.

    • The path option is set to /var/lib/columnstore/storagemanager/cache by default.

    Ensure that the specified path has sufficient storage space for the specified cache size.

    Start the Enterprise ColumnStore Services

    Start and enable the MariaDB Enterprise Server service, so that it starts automatically upon reboot:

    Start and enable the MariaDB Enterprise ColumnStore service, so that it starts automatically upon reboot:

    Create the Utility User

    Enterprise ColumnStore requires a mandatory utility user account to perform cross-engine joins and similar operations.

    1. Create the user account with the statement:

    1. Grant the user account SELECT privileges on all databases with the statement:

    1. Configure Enterprise ColumnStore to use the utility user:

    1. Set the password:

    For details about how to encrypt the password, see "".

    Passwords should meet your organization's password policies. If your MariaDB Enterprise Server instance has a password validation plugin installed, then the password should also meet the configured requirements.

    Configure Linux Security Modules (LSM)

    The specific steps to configure the security module depend on the operating system.

    Configure SELinux (CentOS, RHEL)

    Configure SELinux for Enterprise ColumnStore:

    1. To configure SELinux, you have to install the packages required for audit2allow. On CentOS 7 and RHEL 7, install the following:

    On RHEL 8, install the following:

    1. Allow the system to run under load for a while to generate SELinux audit events.

    2. After the system has taken some load, generate an SELinux policy from the audit events using audit2allow:

    If no audit events were found, this will print the following:

    1. If audit events were found, the new SELinux policy can be loaded using semodule:

    1. Set SELinux to enforcing mode by setting SELINUX=enforcing in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Set SELinux to enforcing mode:

    Configure AppArmor (Ubuntu)

    For information on how to create a profile, see on ubuntu.com.

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Object storage deployment procedure:

    This page was step 3 of 5.

    Next: Step 4: Test MariaDB Enterprise ColumnStore.

    Federated MariaDB Enterprise Spider Topology

    Federated MariaDB Enterprise Spider Topology

    Overview

    In the Federated MariaDB Enterprise Spider topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to a Data Table on a Data Node.

    Benefits

    MariaDB Enterprise Spider:

    • Supports a MariaDB foreign data wrapper. The MariaDB foreign data wrapper can be used to replace the older Federated and FederatedX storage engines.

    • Supports an ODBC foreign data wrapper in MariaDB Enterprise Server 10.5 and later. The ODBC foreign data wrapper is beta maturity. The maturity can be confirmed by querying the table.

    The Spider Federated topology:

    • Can be used to query tables located on a different MariaDB Enterprise Server node from the Spider Node using the MariaDB foreign data wrapper.

    • Can be used to join tables located on a different MariaDB Enterprise Server node with tables on the Spider Node using the MariaDB foreign data wrapper.

    • Can be used to migrate tables located on a different MariaDB Enterprise Server node to the Spider Node using the MariaDB foreign data wrapper.

    Federated MariaDB Enterprise Spider Topology

    In the Spider Federated topology, a Spider Node contains one or more "virtual" Spider Tables. A Spider Table does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses a MariaDB foreign data wrapper to read from and write to a Data Table on a Data Node.

    The Spider Federated topology consists of:

    • One MariaDB Enterprise Server node is a Spider Node

    • One MariaDB Enterprise Server node is a Data Node

    The Spider Node:

    • Contains one or more Spider Tables

    • Uses the plugin for Spider Tables

    • Uses a MariaDB foreign data wrapper to query the Data Table on the Data Node

    The Data Node:

    • Contains a Data Table for each Spider Table

    • Uses a non-Spider storage engine for each Data Table, such as or

    Term Definitions

    Term
    Definition

    Example Use Cases

    Query MariaDB Enterprise Server Nodes

    The Spider Federated topology can be used to query tables located on another MariaDB Enterprise Server node:

    • The MariaDB Enterprise Server node with the desired table is configured as a Data Node.

    • The MariaDB Enterprise Server node that needs to query the table is configured as a Spider Node.

    • The Data Table is the desired table on the Data Node.

    • A Spider Table is created on the Spider Node that references the Data Table on the Data Node.

    • Non-Spider tables can also be referenced in queries with the Spider Table:

    Migrate Tables from MariaDB Enterprise Server Nodes

    The Spider Federated topology can be used to migrate tables from one MariaDB Enterprise Server node to another MariaDB Enterprise Server node:

    • The MariaDB Enterprise Server node with the source table is configured as a Data Node.

    • The MariaDB Enterprise Server node with the destination table is configured as a Spider Node.

    • The Data Table is the source table on the Data Node.

    • A Spider Table is created on the Spider Node that references the Data Table on the Data Node.

    Examples

    Load Spider with Configuration File (ES 10.4+)

    Load Spider with INSTALL SONAME (ES 10.4+)

    View Foreign Data Wrappers (ES 10.5+)

    Create Federated Spider Table

    Resources

    Deployment

    Operations

    Schema Design

    Storage Engines

    Enterprise Server with ColumnStore (Object Storage)

    Deployment instructions for a single-node MariaDB Enterprise Server instance with the ColumnStore engine using S3-compatible object storage.

    Overview

    This procedure describes the deployment of the Single-Node Enterprise ColumnStore topology with Object storage.

    MariaDB Enterprise ColumnStore 23.10 is a columnar storage engine for MariaDB Enterprise Server and Enterprise ColumnStore is best suited for Online Analytical Processing (OLAP) workloads.

    This procedure has 5 steps, which are executed in sequence.

    This page provides an overview of the topology, requirements, and deployment procedures.

    Please read and understand this procedure before executing.

    Step 2: Configure Spider Node and Data Nodes

    Overview

    This page details step 2 of the 3-step procedure "".

    This step configures the Spider Node and Data Nodes and creates the Spider Table and Data Tables.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    [mariadb]
    ...
    plugin_load_add = "ha_spider"
    INSTALL SONAME "ha_spider";
    SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS;
    CREATE SERVER hq_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.2",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "hq_sales"
    );
    
    CREATE SERVER eastern_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.3",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "eastern_sales"
    );
    
    CREATE SERVER western_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.4",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "western_sales"
    );
    
    CREATE DATABASE spider_sharded_sales;
    
    CREATE TABLE spider_sharded_sales.invoices (
       branch_id INT NOT NULL,
       invoice_id INT NOT NULL,
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2)
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=Spider
    PARTITION BY LIST(branch_id) (
       PARTITION hq_partition VALUES IN (1) COMMENT = 'server "hq_server", table "invoices"',
       PARTITION eastern_partition VALUES IN (2) COMMENT = 'server "eastern_server", table "invoices"',
       PARTITION western_partition VALUES IN (3) COMMENT = 'server "western_server", table "invoices"'
    );
    information_schema.PLUGINS
    SHOW REPLICA STATUS
    MariaDB Client
    INSERT
    SELECT

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    To use a specific IAM role, you must uncomment and set iam_role_name, sts_region, and sts_endpoint.

  • To use the IAM role assigned to an EC2 instance, you must uncomment ec2_iam_mode=enabled.

  • character_set_server

    Set this system variable to utf8

    collation_server

    Set this system variable to utf8_general_ci

    columnstore_use_import_for_batchinsert

    Set this system variable to ALWAYS to always use cpimport for LOAD DATA INFILE and INSERT...SELECT statements.

    Create an S3 Bucket
    CREATE USER
    GRANT
    Credentials Management for MariaDB Enterprise ColumnStore
    How to create an AppArmor Profile

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    $ sudo testS3Connection
    StorageManager[26887]: Using the config file found at /etc/columnstore/storagemanager.cnf
    StorageManager[26887]: S3Storage: S3 connectivity & permissions are OK
    S3 Storage Manager Configuration OK
    $ systemctl status mariadb
    $ sudo systemctl start mariadb
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    SELECT PLUGIN_NAME, PLUGIN_STATUS
    FROM information_schema.PLUGINS
    WHERE PLUGIN_LIBRARY LIKE 'ha_columnstore%';
    
    +---------------------+---------------+
    | PLUGIN_NAME         | PLUGIN_STATUS |
    +---------------------+---------------+
    | Columnstore         | ACTIVE        |
    | COLUMNSTORE_COLUMNS | ACTIVE        |
    | COLUMNSTORE_TABLES  | ACTIVE        |
    | COLUMNSTORE_FILES   | ACTIVE        |
    | COLUMNSTORE_EXTENTS | ACTIVE        |
    +---------------------+---------------+
    SHOW REPLICA STATUS\G
    
    *************************** 1. row ***************************
                    Slave_IO_State: Waiting for master to send event
                       Master_Host: localhost
                       Master_User: repl
                       Master_Port: 3306
                     Connect_Retry: 60
                   Master_Log_File: mariadb-bin.000002
               Read_Master_Log_Pos: 695
                    Relay_Log_File: mysqld-relay-bin.000002
                     Relay_Log_Pos: 996
             Relay_Master_Log_File: mariadb-bin.000002
                  Slave_IO_Running: Yes
                 Slave_SQL_Running: Yes
                   Replicate_Do_DB:
               Replicate_Ignore_DB:
                Replicate_Do_Table:
            Replicate_Ignore_Table:
           Replicate_Wild_Do_Table: columnstore_db.htap%
       Replicate_Wild_Ignore_Table:
                        Last_Errno: 0
                        Last_Error:
                      Skip_Counter: 0
               Exec_Master_Log_Pos: 695
                   Relay_Log_Space: 1306
                   Until_Condition: None
                    Until_Log_File:
                     Until_Log_Pos: 0
                Master_SSL_Allowed: No
                Master_SSL_CA_File:
                Master_SSL_CA_Path:
                   Master_SSL_Cert:
                 Master_SSL_Cipher:
                    Master_SSL_Key:
             Seconds_Behind_Master: 0
     Master_SSL_Verify_Server_Cert: No
                     Last_IO_Errno: 0
                     Last_IO_Error:
                    Last_SQL_Errno: 0
                    Last_SQL_Error:
       Replicate_Ignore_Server_Ids:
                  Master_Server_Id: 1
                    Master_SSL_Crl:
                Master_SSL_Crlpath:
                        Using_Gtid: Slave_Pos
                       Gtid_IO_Pos: 0-1-7
           Replicate_Do_Domain_Ids:
       Replicate_Ignore_Domain_Ids:
                     Parallel_Mode: optimistic
                         SQL_Delay: 0
               SQL_Remaining_Delay: NULL
           Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                  Slave_DDL_Groups: 1
    Slave_Non_Transactional_Groups: 0
        Slave_Transactional_Groups: 1
    CREATE DATABASE IF NOT EXISTS test;
    CREATE TABLE IF NOT EXISTS test.contacts (
       first_name VARCHAR(50),
       last_name VARCHAR(50),
       email VARCHAR(100)
    ) ENGINE=ColumnStore;
    INSERT INTO test.contacts (first_name, last_name, email)
       VALUES
       ("Kai", "Devi", "kai.devi@example.com"),
       ("Lee", "Wang", "lee.wang@example.com");
    SELECT * FROM test.contacts;
    
    +------------+-----------+----------------------+
    | first_name | last_name | email                |
    +------------+-----------+----------------------+
    | Kai        | Devi      | kai.devi@example.com |
    | Lee        | Wang      | lee.wang@example.com |
    +------------+-----------+----------------------+
    CREATE TABLE test.addresses (
       email VARCHAR(100),
       street_address VARCHAR(255),
       city VARCHAR(100),
       state_code VARCHAR(2)
    ) ENGINE = InnoDB;
    INSERT INTO test.addresses (email, street_address, city, state_code)
       VALUES
       ("kai.devi@example.com", "1660 Amphibious Blvd.", "Redwood City", "CA"),
       ("lee.wang@example.com", "32620 Little Blvd", "Redwood City", "CA");
    SELECT name AS "Name", addr AS "Address"
    FROM (SELECT CONCAT(first_name, " ", last_name) AS name,
       email FROM test.contacts) AS contacts
    INNER JOIN (SELECT CONCAT(street_address, ", ", city, ", ", state_code) AS addr,
       email FROM test.addresses) AS addr
    WHERE  contacts.email = addr.email;
    
    +----------+-----------------------------------------+
    | Name     | Address                                 |
    +----------+-----------------------------------------+
    | Kai Devi | 1660 Amphibious Blvd., Redwood City, CA |
    | Lee Wang | 32620 Little Blvd, Redwood City, CA     |
    +----------+-----------------------------------------+
    $ sudo mariadb
    CREATE DATABASE columnstore_db;
    
    CREATE DATABASE innodb_db;
    USE innodb_db;
    
    CREATE TABLE htap_test1 (
       id INT
    ) ENGINE = InnoDB;
    
    CREATE TABLE htap_test2 (
       id INT
    ) ENGINE = InnoDB;
    SHOW TABLES FROM columnstore_db;
    
    +--------------------------+
    | Tables_in_columnstore_db |
    +--------------------------+
    | htap_test1               |
    | htap_test2               |
    +--------------------------+
    DROP TABLE IF EXISTS columnstore_db.htap_test1;
    
    CREATE TABLE columnstore_db.htap_test1
    ENGINE=COLUMNSTORE
    SELECT * FROM innodb_db.htap_test1;
    
    DROP TABLE IF EXISTS columnstore_db.htap_test2;
    
    CREATE TABLE columnstore_db.htap_test2
    ENGINE=COLUMNSTORE
    SELECT * FROM innodb_db.htap_test2;
    USE innodb_db;
    
    INSERT INTO htap_test1
    VALUES (100);
    
    INSERT INTO htap_test2
    VALUES (200);
    SELECT * FROM columnstore_db.htap_test1;
    
    +------+
    | id   |
    +------+
    |  100 |
    +------+
    
    SELECT * FROM columnstore_db.htap_test2;
    
    +------+
    | id   |
    +------+
    |  200 |
    +------+
    USE innodb_db;
    CREATE TABLE transactional_test1 (
       id INT
    ) ENGINE = InnoDB;
    SHOW TABLES FROM columnstore_db LIKE 'transactional_%';
    
    Empty set (0.02 sec)
    USE columnstore_db;
    CREATE TABLE analytical_test1 (
       id INT
    ) ENGINE = ColumnStore;
    SHOW TABLES FROM innodb_db LIKE 'analytical_%';
    
    Empty set (0.02 sec)
    [mariadb]
    log_error                              = mariadbd.err
    character_set_server                   = utf8
    collation_server                       = utf8_general_ci
    [ObjectStorage]
    …
    service = S3
    …
    [S3]
    bucket                = your_columnstore_bucket_name
    endpoint              = your_s3_endpoint
    aws_access_key_id     = your_s3_access_key_id
    aws_secret_access_key = your_s3_secret_key
    # iam_role_name       = your_iam_role
    # sts_region          = your_sts_region
    # sts_endpoint        = your_sts_endpoint
    # ec2_iam_mode        = enabled
    
    [Cache]
    cache_size = your_local_cache_size
    path       = your_local_cache_path
    $ sudo systemctl start mariadb
    
    $ sudo systemctl enable mariadb
    $ sudo systemctl start mariadb-columnstore
    
    $ sudo systemctl enable mariadb-columnstore
    CREATE USER 'util_user'@'127.0.0.1'
    IDENTIFIED BY 'util_user_passwd';
    GRANT SELECT, PROCESS ON *.*
    TO 'util_user'@'127.0.0.1';
    $ sudo mcsSetConfig CrossEngineSupport Host 127.0.0.1
    
    $ sudo mcsSetConfig CrossEngineSupport Port 3306
    
    $ sudo mcsSetConfig CrossEngineSupport User util_user
    $ sudo mcsSetConfig CrossEngineSupport Password util_user_passwd
    $ sudo yum install policycoreutils policycoreutils-python
    $ sudo yum install policycoreutils python3-policycoreutils policycoreutils-python-utils
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    
    Nothing to do
    $ sudo semodule -i mariadb_local.pp
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo setenforce enforcing

    Set this option to the file you want to use for the Binary Log. Setting this option enables binary logging.

    Set this system variable to ON.

    Set this option to the file you want to use for the Relay Logs. Setting this option enables relay logging.

    Set this option to the file you want to use to index Relay Log filenames.

    Sets the numeric Server ID for this MariaDB Enterprise Server. The value set on this option must be unique to each node.

    iam_role_name, sts_region, and sts_endpoint
    .
  • To use the IAM role assigned to an EC2 instance, you must uncomment ec2_iam_mode=enabled.

  • binlog_do_db

    Set this to the name of the database to replicate from InnoDB to ColumnStore.

    binlog_format

    Set this to STATEMENT for HTAP.

    character_set_server

    Set this system variable to utf8

    collation_server

    Set this system variable to utf8_general_ci

    columnstore_use_import_for_batchinsert

    Set this system variable to ALWAYS to always use cpimport for LOAD DATA INFILE and INSERT...SELECT statements.

    gtid_strict_mode

    Set this system variable to ON.

    Starting and Stopping MariaDB
    Credentials Management for MariaDB Enterprise ColumnStore
    MariaDB Replication
    CREATE USER
    GRANT
    gtid_slave_pos
    How to create an AppArmor Profile

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    A Spider Table is a virtual table that does not store data. When a Spider Table is queried, the uses foreign data wrappers to read from and write to Data Tables on Data Nodes or ODBC Data Sources.

    On the Spider Node, the Data Table is queried by querying the Spider Table like the following:

    On the Spider node, the Data Table's data is migrated to the destination table by querying the Spider Table like the following:

    Data Node

    A Data Node is a MariaDB Enterprise Server node that contains one or more Data Tables.

    Data Table

    A Data Table stores data for a Spider Table. When a Spider Table is queried, the Enterprise Spider storage engine uses the MariaDB foreign data wrapper to read from and write to the Data Table on a Data Node. The Data Table must be created on the Data Node with the same structure as the Spider Table. The Data Table must use a non-Spider storage engine, such as InnoDB or ColumnStore.

    ODBC Data Source

    An ODBC Data Source relies on an ODBC Driver and an ODBC Driver Manager to query an external data source.

    ODBC Driver

    An ODBC Driver is a library that integrates with a ODBC Driver Manager to query an external data source.

    ODBC Driver Manager

    An ODBC Driver Manager allows applications to use ODBC Drivers.

    Spider Node

    A Spider Node is a MariaDB Enterprise Server node that contains one or more Spider Tables.

    information_schema.SPIDER_WRAPPER_PROTOCOLS
    Enterprise Spider storage engine
    InnoDB
    Operations
    Backup and Restore
    Migrate Tables
    Schema Design
    Enterprise Spider Storage Engine
    ColumnStore

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Spider Table

    Procedure Steps
    Step
    Description

    Step 1

    Step 2

    Step 3

    Step 4

    Step 5

    Support

    Customers can obtain support by submitting a support case.

    Components

    The following components are deployed during this procedure:

    Component
    Function

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    MariaDB Enterprise Server Components

    Component
    Description

    • Columnar Storage Engine

    • Optimized for Online Analytical Processing (OLAP) workloads

    • S3-compatible object storage

    Topology

    The Single-Node Enterprise ColumnStore topology provides support for Online Analytical Processing (OLAP) workloads to MariaDB Enterprise Server.

    The Enterprise ColumnStore node:

    • Receives queries from the application

    • Executes queries

    • Use S3-compatible object storage for data

    High Availability

    Single-Node Enterprise ColumnStore does not provide high availability (HA) for Online Analytical Processing (OLAP). If you would like to deploy Enterprise ColumnStore with high availability, see Enterprise ColumnStore with Object storage.

    Requirements

    These requirements are for the Single-Node Enterprise ColumnStore, when deployed with MariaDB Enterprise Server and MariaDB Enterprise ColumnStore.

    Operating System

    • Debian 11 (x86_64, ARM64)

    • Debian 12 (x86_64, ARM64)

    • Red Hat Enterprise Linux 8 (x86_64, ARM64)

    • Red Hat Enterprise Linux 9 (x86_64, PPC64LE, ARM64)

    • Red Hat UBI 8 (x86_64, ARM64)

    • Rocky Linux 8 (x86_64, ARM64)

    • Rocky Linux 9 (x86_64, ARM64)

    • Ubuntu 20.04 LTS (x86_64, ARM64)

    • Ubuntu 22.04 LTS (x86_64, ARM64)

    • Ubuntu 24.04 LTS (x86_64, ARM64)

    Minimum Hardware Requirements

    MariaDB Enterprise ColumnStore's minimum hardware requirements are not intended for production environments, but the minimum hardware requirements can be appropriate for development and test environments. For production environments, see the recommended hardware requirements instead.

    The minimum hardware requirements are:

    Component
    CPU
    Memory

    Enterprise ColumnStore node

    4+ cores

    16+ GB

    MariaDB Enterprise ColumnStore will refuse to start if the system has less than 3 GB of memory.

    If Enterprise ColumnStore is started on a system with less memory, the following error message will be written to the ColumnStore system log called crit.log:

    And the following error message will be raised to the client:

    Recommended Hardware Requirements

    MariaDB Enterprise ColumnStore's recommended hardware requirements are intended for production analytics.

    The recommended hardware requirements are:

    Component
    CPU
    Memory

    Enterprise ColumnStore node

    64+ cores

    128+ GB

    Storage Requirements

    Single-node Enterprise ColumnStore with Object Storage requires the following storage type:

    Storage Type
    Description

    Single-node Enterprise ColumnStore with Object Storage uses S3-compatible object storage to store data.

    S3-Compatible Object Storage Requirements

    Single-node Enterprise ColumnStore with Object Storage uses S3-compatible object storage to store data.

    Many S3-compatible object storage services exist. MariaDB Corporation cannot make guarantees about all S3-compatible object storage services, because different services provide different functionality.

    For the preferred S3-compatible object storage providers that provide cloud and hardware solutions, see the following sections:

    • Cloud

    • Hardware

    The use of non-cloud and non-hardware providers is at your own risk.

    If you have any questions about using specific S3-compatible object storage with MariaDB Enterprise ColumnStore, contact us.

    Preferred Object Storage Providers: Cloud

    • Amazon Web Services (AWS) S3

    • Google Cloud Storage

    • Azure Storage

    • Alibaba Cloud Object Storage Service

    Preferred Object Storage Providers: Hardware

    • Cloudian HyperStore

    • Dell EMC

    • Seagate Lyve Rack

    • Quantum ActiveScale

    • IBM Cloud Object Storage

    Quick Reference

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set and . The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set and .

    SQL

    Users can set that support dynamic changes on-the-fly using the statement.

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path
    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service.

    Operation
    Command

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    Next Step

    Navigation in the Single-Node Enterprise ColumnStore topology with Object storage deployment procedure:

    Next: Step 1: Install MariaDB Enterprise ColumnStore.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Create Spider User

    The data node requires a user account that the Spider Node uses to connect.

    On each Data Node, create the Spider user account for the Spider Node using the CREATE USER statement:

    Privileges will be granted to the user account in Grant Privileges on the Data Table.

    Test Spider User

    On the Spider Node, confirm that the Spider user account can connect to the Data Node using MariaDB Client:

    Configure Connection Details

    The Spider Node requires connection details for each Data Node.

    On the Spider Node, create a server object to configure the connection details for each Data Node using the CREATE SERVER statement:

    1. Create a Server object to configure the connection details for the Data Node at the headquarters branch:\

    2. Create a server object to configure the connection details for the Data Node at the eastern branch:\

    3. Create a server object to configure the connection details for the Data Node at the western branch:

    The Data Node runs MariaDB Enterprise Server, so the FOREIGN DATA WRAPPER is set to mariadb.

    Using a server object for connection details is optional. Alternatively, the connection details for the Data Node can be specified in the COMMENT table option of the CREATE TABLE statement when creating the Spider Table.

    Create the Data Tables

    When queries read and write to a Spider Table, Spider reads and writes to the Data Tables for each partition on the on the Data Nodes. The Data Tables must be created on the Data Nodes with the same structure as the Spider Table.

    If your Data Tables already exist, grant privileges on the tables to the Spider user.

    On each Data Node, create the Data Tables:

    1. On the Data Node for the headquarters server, create a database and table and add sample data:

      The Spider Node reads and writes to the Data Table using the server and user account configured in "Configure Connection Details". The user account must have privileges on the tables.

    2. On the Data Node for the eastern branch of the business, create a database and table and add sample data:\

      The Spider Node reads and writes to the Data Table using the server and user account configured in "Configure Connection Details". The user account must have privileges on the tables.\

    3. On the Data Node for the western branch of the business, create a database and table and add sample data:\

      The Spider Node reads and writes to the Data Table using the server and user account configured in "". The user account must have .\

    Grant Privileges

    The Spider Node connects to the Data Nodes with the user account configured in "Create Spider User".

    On each Data Node, grant the Spider user sufficient privileges to operate on the Data Table:

    Privileges for Spider BKA Mode

    By default, the Spider user also requires the CREATE TEMPORARY TABLES privilege on the database containing the Data Table. The CREATE TEMPORARY TABLES privilege is required, because Spider uses temporary tables to optimize read queries when Spider BKA Mode is 1.

    Spider BKA Mode is configured using the following methods:

    • The session value is configured by setting the spider_bka_mode system variable on the Spider Node. The default value is -1. When the session value is -1, the value for each Spider Table is used.

    • The value for each Spider Table is configured by setting the bka_mode option in the COMMENT table option. When the bka_mode option is not set, the implicit value is 1.

    The default spider_bka_mode value is -1, and the implicit Spider Table value is 1, so the default Spider BKA Mode is 1.

    On the Data Node, grant the Spider user the CREATE TEMPORARY TABLES privilege on the database:

    Create the Spider Table

    The Spider Table must be created on the Spider Node with the same structure as the Data Tables. The Spider Table must have a partition for each Data Table.

    On the Spider Node, create the Spider Table and reference the Data Node in the COMMENT table option:

    The COMMENT partition option is used to configure the Data Node and the Data Table for each partition. Set the server option to the server object for the partition configured in "Configure Connection Details". Set the table option to the Data Table for the partition.

    An alternative syntax is available. When you don't want to create a server object, the connection details for the Data Nodes can be specified in the COMMENT partition option:

    Next Step

    Navigation in the procedure "Deploy Spider Sharded Topology":

    This page was step 2 of 3.

    Next: Step 3: Test Spider Sharded Topology.

    Deploy Spider Sharded Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Spider Node

    A Spider Table is a virtual table that does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses foreign data wrappers to read from and write to Data Tables on Data Nodes or ODBC Data Sources.

    Install Enterprise Spider
    Configure Spider Node and Data Node
    Test Spider Federated Topology
    MariaDB Enterprise Server
    MariaDB Enterprise Spider
    InnoDB
    ColumnStore

    Spider Node

    A Spider Table is a virtual table that does not store data. When a Spider Table is queried, the Enterprise Spider storage engine uses foreign data wrappers to read from and write to Data Tables on Data Nodes or ODBC Data Sources.

    Install Enterprise Spider
    Configure Spider Node and Data Nodes
    Test Spider Sharded Topology
    MariaDB Enterprise Server
    MariaDB Enterprise Spider
    InnoDB
    ColumnStore
    Enterprise Spider storage engine

    Step 4: Start and Configure MariaDB Enterprise Server

    Overview

    This page details step 4 of the 9-step procedure "Deploy ColumnStore Object Storage Topology".

    This step starts and configures MariaDB Enterprise Server, and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Stop the Enterprise ColumnStore Services

    The installation process might have started some of the ColumnStore services. The services should be stopped prior to making configuration changes.

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise Server service:

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise ColumnStore service:

    1. On each Enterprise ColumnStore node, stop the CMAPI service:

    Configure Enterprise ColumnStore

    On each Enterprise ColumnStore node, configure Enterprise Server.

    Connector
    MariaDB Connector/R2DBC

    Mandatory system variables and options for ColumnStore Object Storage include:

    Example Configuration

    Configure the S3 Storage Manager

    On each Enterprise ColumnStore node, configure S3 Storage Manager to use S3-compatible storage by editing the /etc/columnstore/storagemanager.cnf configuration file:

    The S3-compatible object storage options are configured under [S3]:

    • The bucket option must be set to the name of the bucket that you created in "Create an S3 Bucket".

    • The endpoint option must be set to the endpoint for the S3-compatible object storage.

    • The aws_access_key_id and aws_secret_access_key options must be set to the access key ID and secret access key for the S3-compatible object storage.

    • To use a specific IAM role, you must uncomment and set

    The local cache options are configured under [Cache]:

    • The cache_size option is set to 2 GB by default.

    • The path option is set to /var/lib/columnstore/storagemanager/cache by default.

    Ensure that the specified path has sufficient storage space for the specified cache size.

    Start the Enterprise ColumnStore Services

    1. On each Enterprise ColumnStore node, start and enable the MariaDB Enterprise Server service, so that it starts automatically upon reboot:

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise ColumnStore service:

    After the CMAPI service is installed in the next step, CMAPI will start the Enterprise ColumnStore service as-needed on each node. CMAPI disables the Enterprise ColumnStore service to prevent systemd from automatically starting Enterprise ColumnStore upon reboot.

    1. On each Enterprise ColumnStore node, start and enable the CMAPI service, so that it starts automatically upon reboot:

    For additional information, see "".

    Create User Accounts

    The ColumnStore Object Storage topology requires several user accounts. Each user account should be created on the primary server, so that it is replicated to the replica servers.

    Create the Utility User

    Enterprise ColumnStore requires a mandatory utility user account to perform cross-engine joins and similar operations.

    1. On the primary server, create the user account with the CREATE USER statement:

    1. On the primary server, grant the user account SELECT privileges on all databases with the GRANT statement:

    1. On each Enterprise ColumnStore node, configure the ColumnStore utility user:

    1. On each Enterprise ColumnStore node, set the password:

    For details about how to encrypt the password, see "".

    Passwords should meet your organization's password policies. If your MariaDB Enterprise Server instance has a password validation plugin installed, then the password should also meet the configured requirements.

    Create the Replication User

    ColumnStore Object Storage uses MariaDB Replication to replicate writes between the primary and replica servers. As MaxScale can promote a replica server to become a new primary in the event of node failure, all nodes must have a replication user.

    The action is performed on the primary server.

    Create the replication user and grant it the required privileges:

    1. Use the CREATE USER statement to create replication user.

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect to the primary server from each replica.

    1. Grant the user account the required privileges with the GRANT statement.

    Create MaxScale User

    ColumnStore Object Storage 23.10 uses MariaDB MaxScale 22.08 to load balance between the nodes.

    This action is performed on the primary server.

    1. Use the statement to create the MaxScale user:

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect from the IP address of the MaxScale instance.

    1. Use the statement to grant the privileges required by the router:

    1. Use the statement to grant privileges required by the MariaDB Monitor.

    Configure MariaDB Replication

    On each replica server, configure MariaDB Replication:

    1. Use the CHANGE MASTER TO statement to configure the connection to the primary server:

    1. Start replication using the START REPLICA statement:

    1. Confirm that replication is working using the SHOW REPLICA STATUS statement:

    Ensure that the replica server cannot accept local writes by setting the read_only system variable to ON using the SET GLOBAL statement:

    Initiate the Primary Server with CMAPI

    Initiate the primary server using CMAPI.

    1. Create an API key for the cluster. This API key should be stored securely and kept confidential, because it can be used to add cluster nodes to the multi-node Enterprise ColumnStore deployment.

    For example, to create a random 256-bit API key using openssl rand:

    This document will use the following API key in further examples, but users should create their own:

    1. Use CMAPI to add the primary server to the cluster and set the API key. The new API key needs to be provided as part of the X-API-key HTML header.

    For example, if the primary server's host name is mcs1 and its IP address is 192.0.2.1, use the following node command:

    1. Use CMAPI to check the status of the cluster node:

    Add Replica Servers with CMAPI

    Add the replica servers with CMAPI:

    1. For each replica server, use to add the replica server to the cluster. The previously set API key needs to be provided as part of the X-API-key HTML header.

    For example, if the primary server's host name is mcs1 and the replica server's IP address is 192.0.2.2, use the following node command:

    1. After all replica servers have been added, use CMAPI to confirm that all cluster nodes have been successfully added:

    Configure Linux Security Modules (LSM)

    The specific steps to configure the security module depend on the operating system.

    Configure SELinux (CentOS, RHEL)

    Configure SELinux for Enterprise ColumnStore:

    1. To configure SELinux, you have to install the packages required for audit2allow. On CentOS 7 and RHEL 7, install the following:

    On RHEL 8, install the following:

    1. Allow the system to run under load for a while to generate SELinux audit events.

    2. After the system has taken some load, generate an SELinux policy from the audit events using audit2allow:

    If no audit events were found, this will print the following:

    1. If audit events were found, the new SELinux policy can be loaded using semodule:

    1. Set SELinux to enforcing mode:

    1. Set SELinux to enforcing mode by setting SELINUX=enforcing in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Confirm that SELinux is in enforcing mode:

    Configure AppArmor (Ubuntu)

    For information on how to create a profile, see on Ubuntu.com.

    Configure Firewalls

    The specific steps to configure the firewall service depend on the platform.

    Configure firewalld (CentOS, RHEL)

    Configure firewalld for Enterprise Cluster on CentOS and RHEL:

    1. Check if the firewalld service is running:

    1. If the firewalld service was stopped to perform the installation, start it now:

    For example, if your cluster nodes are in the 192.0.2.0/24 subnet:

    1. Open up the relevant ports using firewall-cmd:

    1. Reload the runtime configuration:

    Configure UFW (Ubuntu)

    Configure UFW for Enterprise ColumnStore on Ubuntu:

    1. Check if the UFW service is running:

    1. If the UFW service was stopped to perform the installation, start it now:

    1. Open up the relevant ports using ufw.

    For example, if your cluster nodes are in the 192.0.2.0/24 subnet in the range 192.0.2.1 - 192.0.2.3:

    1. Reload the runtime configuration:

    Next Step

    Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

    This page was step 4 of 9.

    Next: Step 5: Test MariaDB Enterprise Server.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Step 4: Start and Configure MariaDB Enterprise Server

    Overview

    This page details step 4 of the 9-step procedure "Deploy ColumnStore Shared Local Storage Topology".

    This step starts and configures MariaDB Enterprise Server, and MariaDB Enterprise ColumnStore 23.10.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Stop the Enterprise ColumnStore Services

    The installation process might have started some of the ColumnStore services. The services should be stopped prior to making configuration changes.

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise Server service:

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise ColumnStore service:

    1. On each Enterprise ColumnStore node, stop the CMAPI service:

    Configure Enterprise ColumnStore

    On each Enterprise ColumnStore node, configure Enterprise Server.

    Connector
    MariaDB Connector/R2DBC

    Mandatory system variables and options for ColumnStore Object Storage include:

    Example Configuration

    Start the Enterprise ColumnStore Services

    1. On each Enterprise ColumnStore node, start and enable the MariaDB Enterprise Server service, so that it starts automatically upon reboot:

    1. On each Enterprise ColumnStore node, stop the MariaDB Enterprise ColumnStore service:

    After the CMAPI service is installed in the next step, CMAPI will start the Enterprise ColumnStore service as-needed on each node. CMAPI disables the Enterprise ColumnStore service to prevent systemd from automatically starting Enterprise ColumnStore upon reboot.

    1. On each Enterprise ColumnStore node, start and enable the CMAPI service, so that it starts automatically upon reboot:

    For additional information, see "Start and Stop Services".

    Create User Accounts

    The ColumnStore Object Storage topology requires several user accounts. Each user account should be created on the primary server, so that it is replicated to the replica servers.

    Create the Utility User

    Enterprise ColumnStore requires a mandatory utility user account to perform cross-engine joins and similar operations.

    1. On the primary server, create the user account with the CREATE USER statement:

    1. On the primary server, grant the user account SELECT privileges on all databases with the GRANT statement:

    1. On each Enterprise ColumnStore node, configure the ColumnStore utility user:

    1. On each Enterprise ColumnStore node, set the password:

    For details about how to encrypt the password, see "".

    Passwords should meet your organization's password policies. If your MariaDB Enterprise Server instance has a password validation plugin installed, then the password should also meet the configured requirements.

    Create the Replication User

    ColumnStore Object Storage uses MariaDB Replication to replicate writes between the primary and replica servers. As MaxScale can promote a replica server to become a new primary in the event of node failure, all nodes must have a replication user.

    The action is performed on the primary server.

    Create the replication user and grant it the required privileges:

    1. Use the CREATE USER statement to create replication user.

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect to the primary server from each replica.

    1. Grant the user account the required privileges with the GRANT statement.

    Create MaxScale User

    ColumnStore Object Storage 23.10 uses MariaDB MaxScale 22.08 to load balance between the nodes.

    This action is performed on the primary server.

    1. Use the statement to create the MaxScale user:

    Replace the referenced IP address with the relevant address for your environment.

    Ensure that the user account can connect from the IP address of the MaxScale instance.

    1. Use the statement to grant the privileges required by the router:

    1. Use the statement to grant privileges required by the MariaDB Monitor.

    Configure MariaDB Replication

    On each replica server, configure MariaDB Replication:

    1. Use the CHANGE MASTER TO statement to configure the connection to the primary server:

    1. Start replication using the START REPLICA statement:

    1. Confirm that replication is working using the SHOW REPLICA STATUS statement:

    Ensure that the replica server cannot accept local writes by setting the read_only system variable to ON using the SET GLOBAL statement:

    Initiate the Primary Server with CMAPI

    Initiate the primary server using CMAPI.

    1. Create an API key for the cluster. This API key should be stored securely and kept confidential, because it can be used to add cluster nodes to the multi-node Enterprise ColumnStore deployment.

    For example, to create a random 256-bit API key using openssl rand:

    This document will use the following API key in further examples, but users should create their own:

    1. Use CMAPI to add the primary server to the cluster and set the API key. The new API key needs to be provided as part of the X-API-key HTML header.

    For example, if the primary server's host name is mcs1 and its IP address is 192.0.2.1, use the following node command:

    1. Use CMAPI to check the status of the cluster node:

    Add Replica Servers with CMAPI

    Add the replica servers with CMAPI:

    1. For each replica server, use to add the replica server to the cluster. The previously set API key needs to be provided as part of the X-API-key HTML header.

    For example, if the primary server's host name is mcs1 and the replica server's IP address is 192.0.2.2, use the following node command:

    1. After all replica servers have been added, use CMAPI to confirm that all cluster nodes have been successfully added:

    Configure Linux Security Modules (LSM)

    The specific steps to configure the security module depend on the operating system.

    Configure SELinux (CentOS, RHEL)

    Configure SELinux for Enterprise ColumnStore:

    1. To configure SELinux, you have to install the packages required for audit2allow. On CentOS 7 and RHEL 7, install the following:

    On RHEL 8, install the following:

    1. Allow the system to run under load for a while to generate SELinux audit events.

    2. After the system has taken some load, generate an SELinux policy from the audit events using audit2allow:

    If no audit events were found, this will print the following:

    1. If audit events were found, the new SELinux policy can be loaded using semodule:

    1. Set SELinux to enforcing mode:

    1. Set SELinux to enforcing mode by setting SELINUX=enforcing in /etc/selinux/config.

    For example, the file will usually look like this after the change:

    1. Confirm that SELinux is in enforcing mode:

    Configure AppArmor (Ubuntu)

    For information on how to create a profile, see on Ubuntu.com.

    Configure Firewalls

    The specific steps to configure the firewall service depend on the platform.

    Configure firewalld (CentOS, RHEL)

    Configure firewalld for Enterprise Cluster on CentOS and RHEL:

    1. Check if the firewalld service is running:

    1. If the firewalld service was stopped to perform the installation, start it now:

    For example, if your cluster nodes are in the 192.0.2.0/24 subnet:

    1. Open up the relevant ports using firewall-cmd:

    1. Reload the runtime configuration:

    Configure UFW (Ubuntu)

    Configure UFW for Enterprise ColumnStore on Ubuntu:

    1. Check if the UFW service is running:

    1. If the UFW service was stopped to perform the installation, start it now:

    1. Open up the relevant ports using ufw.

    For example, if your cluster nodes are in the 192.0.2.0/24 subnet in the range 192.0.2.1 - 192.0.2.3:

    1. Reload the runtime configuration:

    Next Step

    Navigation in the procedure "Deploy ColumnStore Shared Local Storage Topology".

    This page was step 4 of 9.

    Next: Step 5: Test MariaDB Enterprise Server.

    ColumnStore Shared Local Storage

    Overview

    Software Version
    Diagram
    Features
    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    Columnar storage engine with S3-compatible object storage

    • Highly available

    • Automatic failover via MaxScale and CMAPI

    • Scales reads via MaxScale

    • Bulk data import

    This procedure describes the deployment of the ColumnStore Shared Local Storage topology with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5.

    MariaDB Enterprise ColumnStore 5 is a columnar storage engine for MariaDB Enterprise Server 10.5. Enterprise ColumnStore is suitable for Online Analytical Processing (OLAP) workloads.

    This procedure has 9 steps, which are executed in sequence.

    This procedure represents basic product capability and deploys 3 Enterprise ColumnStore nodes and 1 MaxScale node.

    This page provides an overview of the topology, requirements, and deployment procedures.

    Please read and understand this procedure before executing.

    Procedure Steps

    Step
    Description

    Support

    Customers can obtain support by submitting a support case.

    Components

    The following components are deployed during this procedure:

    Component
    Function

    MariaDB Enterprise Server Components

    Component
    Description

    MariaDB MaxScale Components

    Component
    Description

    Topology

    The MariaDB Enterprise ColumnStore topology with Object Storage delivers production analytics with high availability, fault tolerance, and limitless data storage by leveraging S3-compatible storage.

    The topology consists of:

    • One or more MaxScale nodes

    • An odd number of ColumnStore nodes (minimum of 3) running ES, Enterprise ColumnStore, and CMAPI

    The MaxScale nodes:

    • Monitor the health and availability of each ColumnStore node using the MariaDB Monitor (mariadbmon)

    • Accept client and application connections

    • Route queries to ColumnStore nodes using the Read/Write Split Router (readwritesplit)

    The ColumnStore nodes:

    • Receive queries from MaxScale

    • Execute queries

      • Use for the

    Requirements

    These requirements are for the ColumnStore Object Storage topology when deployed with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5.

    • Node Count

    • Operating System

    • Minimum Hardware Requirements

    • Recommended Hardware Requirements

    Node Count

    • MaxScale nodes, 1 or more are required.

    • Enterprise ColumnStore nodes, 3 or more are required for high availability. You should always have an odd number of nodes in a multi-node ColumnStore deployment to avoid split brain scenarios.

    Operating System

    In alignment to the , the ColumnStore Object Storage topology with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5 is provided for:

    • CentOS Linux 7 (x86_64)

    • Debian 10 (x86_64)

    • Red Hat Enterprise Linux 7 (x86_64)

    • Red Hat Enterprise Linux 8 (x86_64)

    Minimum Hardware Requirements

    MariaDB Enterprise ColumnStore's minimum hardware requirements are not intended for production environments, but the minimum hardware requirements can be appropriate for development and test environments. For production environments, see the recommended hardware requirements instead.

    The minimum hardware requirements are:

    Component
    CPU
    Memory

    MariaDB Enterprise ColumnStore will refuse to start if the system has less than 3 GB of memory.

    If Enterprise ColumnStore is started on a system with less memory, the following error message will be written to the ColumnStore system log called crit.log:

    And the following error message will be raised to the client:

    Recommended Hardware Requirements

    MariaDB Enterprise ColumnStore's recommended hardware requirements are intended for production analytics.

    The recommended hardware requirements are:

    Component
    CPU
    Memory

    Storage Requirements

    The ColumnStore Object Storage topology requires the following storage types:

    Storage Type
    Description

    Shared Local Storage Directories

    The ColumnStore Object Storage topology uses shared local storage for the Storage Manager directory to store metadata.

    The Storage Manager directory is located at the following path by default:

    • /var/lib/columnstore/storagemanager

    Shared Local Storage Options

    The most common shared local storage options for the ColumnStore Object Storage topology are:

    Shared Local Storage
    Common Usage
    Description

    Enterprise ColumnStore Management with CMAPI

    Enterprise ColumnStore's CMAPI (Cluster Management API) is a REST API that can be used to manage a multi-node Enterprise ColumnStore cluster.

    Many tools are capable of interacting with REST APIs. For example, the curl utility could be used to make REST API calls from the command-line.

    Many programming languages also have libraries for interacting with REST APIs.

    The examples below show how to use the CMAPI with curl.

    URL Endpoint Format for REST API

    For example:

    Required Request Headers

    • 'x-api-key': '93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd'

    • 'Content-Type': 'application/json'

    x-api-key can be set to any value of your choice during the first call to the server. Subsequent connections will require this same key.

    Get Status

    Start Cluster

    Stop Cluster

    Add Node

    Remove Node

    Quick Reference

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service.

    Operation
    Command

    For additional information, see "".

    MariaDB Enterprise Server Logs

    MariaDB Enterprise Server produces log data that can be helpful in problem diagnosis.

    Log filenames and locations may be overridden in the server configuration. The default location of logs is the data directory. The data directory is specified by the datadir system variable.

    Log
    System Variable/Option
    Default Filename

    Enterprise ColumnStore Service Management

    The systemctl command is used to start and stop the ColumnStore service.

    Operation
    Command

    In the ColumnStore Object Storage topology, the mariadb-columnstore service should not be enabled. The CMAPI service restarts Enterprise ColumnStore as needed, so it does not need to start automatically upon reboot.

    Enterprise ColumnStore CMAPI Service Management

    The systemctl command is used to start and stop the CMAPI service.

    Operation
    Command

    For additional information on endpoints, see "CMAPI".

    MaxScale Configuration Management

    MaxScale can be configured using several methods. These methods make use of MaxScale's .

    Method
    Benefits

    The procedure on these pages configures MaxScale using MaxCtrl.

    MaxScale Service Management

    The systemctl command is used to start and stop the MaxScale service.>

    Operation
    Command

    For additional information, see "Start and Stop Services".

    Next Step

    Navigation in the procedure Shared Local Storage topology

    Next: Step 1: Prepare ColumnStore Nodes.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Step 8: Test MariaDB MaxScale

    Overview

    This page details step 8 of the 9-step procedure "Deploy ColumnStore Shared Local Storage Topology".

    This step tests MariaDB MaxScale 22.08.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Check Global Configuration

    Use command to view the global MaxScale configuration.

    This action is performed on the MaxScale node:

    Output should align to the global MaxScale configuration in the new configuration file you created.

    Check Server Configuration

    Use the and commands to view the configured server objects.

    This action is performed on the MaxScale node:

    1. Obtain the full list of servers objects:

    For each server object, view the configuration:

    Output should align to the Server Object configuration you performed.

    Check Monitor Configuration

    Use the and commands to view the configured monitors.

    This action is performed on the MaxScale node:

    1. Obtain the full list of monitors:

    1. For each monitor, view the monitor configuration:

    Output should align to the MariaDB Monitor (mariadbmon) configuration you performed.

    Check Service Configuration

    Use the and commands to view the configured routing services.

    This action is performed on the MaxScale node:

    1. Obtain the full list of routing services:

    1. For each service, view the service configuration:

    Output should align to the or configuration you performed.

    Test Application User

    Applications should use a dedicated user account. The user account must be created on the primary server.

    When users connect to MaxScale, MaxScale authenticates the user connection before routing it to an Enterprise Server node. Enterprise Server authenticates the connection as originating from the IP address of the MaxScale node.

    The application users must have one user account with the host IP address of the application server and a second user account with the host IP address of the MaxScale node.

    The requirement of a duplicate user account can be avoided by enabling the proxy_protocol parameter for MaxScale and the proxy_protocol_networks for Enterprise Server.

    Create a User to Connect from MaxScale

    This action is performed on the primary Enterprise ColumnStore node:

    1. Connect to the primary Enterprise ColumnStore node:

    1. Create the database user account for your MaxScale node:

    Replace 192.0.2.10 with the relevant IP address specification for your MaxScale node.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the database user account for your MaxScale node:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Create a User to Connect from the Application Server

    This action is performed on the primary Enterprise ColumnStore node:

    1. Create the database user account for your application server:

    Replace 192.0.2.11 with the relevant IP address specification for your application server.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the d database user account for your application server:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Test Connection with Application User

    To test the connection, use the MariaDB Client from your application server to connect to an Enterprise ColumnStore node through MaxScale.

    This action is performed on a client connected to the MaxScale node:

    Test Connection with Read Connection Router

    If you configured the Read Connection Router, confirm that MaxScale routes connections to the replica servers.

    On the MaxScale node, use the command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each, use MariaDB Client to connect to the listener port for the Read Connection Router (in the example, 3308):

    Use the application user credentials you created for the --user and --password options.

    1. In each terminal, query the hostname and server_id system variable and option to identify to which you're connected:

    Different terminals should return different values since MaxScale routes the connections to different nodes.

    Since the router was configured with the slave router option, the Read Connection Router only routes connections to replica servers.

    Test Write Queries with Read/Write Split Router

    If you configured the Read/Write Split Router, confirm that MaxScale routes write queries on this router to the primary Enterprise ColumnStore node.

    on the MaxScale node, use the command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each, use MariaDB Client to connect to the listener port for the Read/Write Split Router (in the example, 3307):

    Use the application user credentials you created for the --user and --password options.

    1. In one terminal, create the test table:

    1. In each terminal, issue an insert.md statement to add a row to the example table with the values of the hostname and server_id system variable and option:

    1. In one terminal, issue a SELECT statement to query the results:

    While MaxScale is handling multiple connections from different terminals, it routed all connections to the current primary Enterprise ColumnStore node, which in the example is mcs1#.

    Test Read Queries with Read/Write Split Router

    If you configured the , confirm that MaxScale routes read queries on this router to replica servers.

    1. On the MaxScale node, use the command to view the available listeners and ports:

    1. In a terminal connected to your application server, use MariaDB Client to connect to the listener port for the (in the example, 3307):

    Use the application user credentials you created for the --user and --password options.

    1. Query the hostname and server_id to identify which server MaxScale routed you to.

    1. Resend the query:

    Confirm that MaxScale routes the SELECT statements to different replica servers.

    For more information on different routing criteria, see slave_selection_criteria

    Next Step

    "Deploy ColumnStore Shared Local Storage Topology".

    This page was step 8 of 9.

    Next: Step 9: Import Data.

    Step 8: Test MariaDB MaxScale

    Overview

    This page details step 8 of the 9-step procedure "".

    This step tests MariaDB MaxScale 22.08.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    $ sudo systemctl stop mariadb
    $ sudo systemctl stop mariadb-columnstore
    $ sudo systemctl stop mariadb-columnstore-cmapi
    [mariadb]
    log_error                              = mariadbd.err
    character_set_server                   = utf8
    collation_server                       = utf8_general_ci
    
    # Replication Configuration (HTAP Server)
    server_id                     = 1
    log_bin                       = mariadb-bin
    binlog_format                 = STATEMENT
    log_slave_updates             = OFF
    columnstore_replication_slave = ON
    
    # HTAP filtering rules
    
    # Transactions replicate from same server
    replicate_same_server_id = ON
    
    # Only write queries that touch 'innodb_db' to the binary log
    binlog_do_db = innodb_db
    
    # Rewrite innodb_db to columnstore_db prior to applying transaction
    replicate_rewrite_db = innodb_db->columnstore_db
    
    # Only replicate tables that begin with "htap"
    replicate_wild_do_table = columnstore_db.htap%
    [ObjectStorage]
    …
    service = S3
    …
    [S3]
    bucket                = your_columnstore_bucket_name
    endpoint              = your_s3_endpoint
    aws_access_key_id     = your_s3_access_key_id
    aws_secret_access_key = your_s3_secret_key
    # iam_role_name       = your_iam_role
    # sts_region          = your_sts_region
    # sts_endpoint        = your_sts_endpoint
    # ec2_iam_mode        = enabled
    
    [Cache]
    cache_size = your_local_cache_size
    path       = your_local_cache_path
    $ sudo systemctl start mariadb
    
    $ sudo systemctl enable mariadb
    $ sudo systemctl start mariadb-columnstore
    
    $ sudo systemctl enable mariadb-columnstore
    CREATE USER 'util_user'@'127.0.0.1'
    IDENTIFIED BY 'util_user_passwd';
    GRANT SELECT, PROCESS ON *.*
    TO 'util_user'@'127.0.0.1';
    $ sudo mcsSetConfig CrossEngineSupport Host 127.0.0.1
    
    $ sudo mcsSetConfig CrossEngineSupport Port 3306
    
    $ sudo mcsSetConfig CrossEngineSupport User util_user
    $ sudo mcsSetConfig CrossEngineSupport Password util_user_passwd
    CREATE USER 'repl'@'localhost' IDENTIFIED BY 'passwd';
    GRANT REPLICA MONITOR,
       REPLICATION REPLICA
    ON *.* TO 'repl'@'localhost';
    SET GLOBAL gtid_slave_pos='';
    CHANGE MASTER TO
       MASTER_HOST='localhost',
       MASTER_USER='htap_replication',
       MASTER_PASSWORD='passwd',
       MASTER_USE_GTID=slave_pos;
    START REPLICA;
    SHOW REPLICA STATUS;
    $ sudo yum install policycoreutils policycoreutils-python
    $ sudo yum install policycoreutils python3-policycoreutils policycoreutils-python-utils
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    
    Nothing to do
    $ sudo semodule -i mariadb_local.pp
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo setenforce enforcing
    SELECT * FROM spider_tab;
    SELECT *
    FROM spider_tab s
    JOIN innodb_tab i
    ON s.id=i.id;
    INSERT INTO innodb_tab
       SELECT * FROM spider_tab;
    [mariadb]
    ...
    plugin_load_add = "ha_spider"
    INSTALL SONAME "ha_spider";
    SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS;
    CREATE SERVER hq_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.2",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "hq_sales"
    );
    
    CREATE DATABASE spider_hq_sales;
    
    CREATE TABLE spider_hq_sales.invoices (
       branch_id INT NOT NULL,
       invoice_id INT NOT NULL,
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=Spider
    COMMENT='server "hq_server", table "invoices"';
    Apr 30 21:54:35 a1ebc96a2519 PrimProc[1004]: 35.668435 |0|0|0| C 28 CAL0000: Error total memory available is less than 3GB.
    ERROR 1815 (HY000): Internal error: System is not ready yet. Please try again.
    CREATE SERVER hq_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.2",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "hq_sales"
    );
    CREATE SERVER eastern_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.3",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "eastern_sales"
    );
    CREATE SERVER western_server
    FOREIGN DATA WRAPPER mariadb
    OPTIONS (
       HOST "192.0.2.4",
       PORT 5801,
       USER "spider_user",
       PASSWORD "password",
       DATABASE "western_sales"
    );
    CREATE DATABASE hq_sales;
    
    CREATE SEQUENCE hq_sales.invoice_seq;
    
    CREATE TABLE hq_sales.invoices (
       branch_id INT NOT NULL DEFAULT (1) CHECK (branch_id=1),
       invoice_id INT NOT NULL DEFAULT (NEXT VALUE FOR hq_sales.invoice_seq),
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=InnoDB;
    
    INSERT INTO hq_sales.invoices
       (customer_id, invoice_date, invoice_total, payment_method)
    VALUES
       (1, '2020-05-10 12:35:10', 1087.23, 'CREDIT_CARD'),
       (2, '2020-05-10 14:17:32', 1508.57, 'WIRE_TRANSFER'),
       (3, '2020-05-10 14:25:16', 227.15, 'CASH');
    CREATE DATABASE eastern_sales;
    
    CREATE SEQUENCE eastern_sales.invoice_seq;
    
    CREATE TABLE eastern_sales.invoices (
       branch_id INT NOT NULL DEFAULT (2) CHECK (branch_id=2),
       invoice_id INT NOT NULL DEFAULT (NEXT VALUE FOR eastern_sales.invoice_seq),
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=InnoDB;
    
    INSERT INTO eastern_sales.invoices
       (customer_id, invoice_date, invoice_total, payment_method)
    VALUES
       (2, '2020-05-10 12:31:00', 1351.04, 'CREDIT_CARD'),
       (2, '2020-05-10 12:45:27', 162.11, 'WIRE_TRANSFER'),
       (4, '2020-05-10 13:11:23', 350.00, 'CASH');
    CREATE DATABASE western_sales;
    
    CREATE SEQUENCE western_sales.invoice_seq;
    
    CREATE TABLE western_sales.invoices (
       branch_id INT NOT NULL DEFAULT (3) CHECK (branch_id=3),
       invoice_id INT NOT NULL DEFAULT (NEXT VALUE FOR western_sales.invoice_seq),
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=InnoDB;
    
    INSERT INTO western_sales.invoices
       (customer_id, invoice_date, invoice_total, payment_method)
    VALUES
       (5, '2020-05-10 12:31:00', 111.50, 'CREDIT_CARD'),
       (8, '2020-05-10 12:45:27', 1509.23, 'WIRE_TRANSFER'),
       (3, '2020-05-10 13:11:23', 3301.66, 'CASH');
    CREATE USER spider_user@192.0.2.1 IDENTIFIED BY "password";
    $ mariadb --user spider_user --host 192.0.2.2 --password
    GRANT ALL PRIVILEGES ON hq_sales.invoices TO 'spider_user'@'192.0.2.1';
    GRANT CREATE TEMPORARY TABLES ON hq_sales.* TO 'spider_user'@'192.0.2.1';
    CREATE DATABASE spider_sharded_sales;
    
    CREATE TABLE spider_sharded_sales.invoices (
       branch_id INT NOT NULL,
       invoice_id INT NOT NULL,
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=Spider
    PARTITION BY LIST(branch_id) (
       PARTITION hq_partition VALUES IN (1) COMMENT = 'server "hq_server", table "invoices"',
       PARTITION eastern_partition VALUES IN (2) COMMENT = 'server "eastern_server", table "invoices"',
       PARTITION western_partition VALUES IN (3) COMMENT = 'server "western_server", table "invoices"'
    );
    CREATE TABLE spider_hq_sales.invoices_alternate (
       branch_id INT NOT NULL,
       invoice_id INT NOT NULL,
       customer_id INT,
       invoice_date DATETIME(6),
       invoice_total DECIMAL(13, 2),
       payment_method ENUM('NONE', 'CASH', 'WIRE_TRANSFER', 'CREDIT_CARD', 'GIFT_CARD'),
       PRIMARY KEY(branch_id, invoice_id)
    ) ENGINE=Spider
    COMMENT='table "invoices", host "192.0.2.2", port "5801", user "spider_user", password "user_password", database "hq_sales"';
    Configure Connection Details
    privileges on the tables
    log_bin
    log_slave_updates
    replicate_rewrite_db
    replicate_wild_do_table
    server_id
    Prepare System for Enterprise ColumnStore
    Install Enterprise ColumnStore
    Start and Configure Enterprise ColumnStore
    Test Enterprise ColumnStore
    Bulk Import Data to Enterprise ColumnStore
    MariaDB Enterprise Server
    S3-Compatible Object Storage
    system variables
    options
    system variables
    options
    system variables
    SET
    MariaDB Enterprise ColumnStore
    maxctrl show maxscale
    maxctrl list servers
    maxctrl show server
    maxctrl list monitors
    maxctrl show monitor
    maxctrl list services
    maxctrl show service
    Read Connection Router (readconnroute)
    Read/Write Split Router (readwritesplit)
    maxctrl list listeners
    maxctrl list listeners
    Read/Write Split Router (readwritesplit)
    maxctrl list listeners
    Read/Write Split Router (readwritesplit)

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Check Global Configuration

    Use maxctrl show maxscale command to view the global MaxScale configuration.

    This action is performed on the MaxScale node:

    Output should align to the global MaxScale configuration in the new configuration file you created.

    Check Server Configuration Use the maxctrl list servers and maxctrl show server commands to view the configured server objects.

    This action is performed on the MaxScale node:

    1. Obtain the full list of servers objects:

    For each server object, view the configuration:

    Output should align to the Server Object configuration you performed.

    Check Monitor Configuration

    Use the maxctrl list monitors and maxctrl show monitor commands to view the configured monitors.

    This action is performed on the MaxScale node:

    1. Obtain the full list of monitors:

    1. For each monitor, view the monitor configuration:

    Output should align to the MariaDB Monitor (mariadbmon) configuration you performed.

    Check Service Configuration

    Use the maxctrl list services and maxctrl show service commands to view the configured routing services.

    This action is performed on the MaxScale node:

    1. Obtain the full list of routing services:

    1. For each service, view the service configuration:

    Output should align to the Read Connection Router (readconnroute) or Read/Write Split Router (readwritesplit) configuration you performed.

    Test Application User

    Applications should use a dedicated user account. The user account must be created on the primary server.

    When users connect to MaxScale, MaxScale authenticates the user connection before routing it to an Enterprise Server node. Enterprise Server authenticates the connection as originating from the IP address of the MaxScale node.

    The application users must have one user account with the host IP address of the application server and a second user account with the host IP address of the MaxScale node.

    The requirement of a duplicate user account can be avoided by enabling the proxy_protocol parameter for MaxScale and the proxy_protocol_networks for Enterprise Server.

    Create a User to Connect from MaxScale

    This action is performed on the primary Enterprise ColumnStore node:

    1. Connect to the primary Enterprise ColumnStore node:

    1. Create the database user account for your MaxScale node:

    Replace 192.0.2.10 with the relevant IP address specification for your MaxScale node.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the database user account for your MaxScale node:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Create a User to Connect from the Application Server

    This action is performed on the primary Enterprise ColumnStore node:

    1. Create the database user account for your application server:

    Replace 192.0.2.11 with the relevant IP address specification for your application server.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the d database user account for your application server:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Test Connection with Application User

    To test the connection, use the MariaDB Client from your application server to connect to an Enterprise ColumnStore node through MaxScale.

    This action is performed on a client connected to the MaxScale node:

    Test Connection with Read Connection Router

    If you configured the Read Connection Router, confirm that MaxScale routes connections to the replica servers.

    On the MaxScale node, use the maxctrl list listeners command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each, use MariaDB Client to connect to the listener port for the Read Connection Router (in the example, 3308):

    Use the application user credentials you created for the --user and --password options.

    1. In each terminal, query the hostname and server_id system variable and option to identify to which you're connected:

    Different terminals should return different values since MaxScale routes the connections to different nodes.

    Since the router was configured with the slave router option, the Read Connection Router only routes connections to replica servers.

    Test Write Queries with Read/Write Split Router

    If you configured the Read/Write Split Router, confirm that MaxScale routes write queries on this router to the primary Enterprise ColumnStore node.

    on the MaxScale node, use the maxctrl list listeners command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each, use MariaDB Client to connect to the listener port for the Read/Write Split Router (in the example, 3307):

    Use the application user credentials you created for the --user and --password options.

    1. In one terminal, create the test table:

    1. In each terminal, issue an insert.md statement to add a row to the example table with the values of the hostname and server_id system variable and option:

    1. In one terminal, issue a SELECT statement to query the results:

    While MaxScale is handling multiple connections from different terminals, it routed all connections to the current primary Enterprise ColumnStore node, which in the example is mcs1#.

    Test Read Queries with Read/Write Split Router

    If you configured the Read/Write Split Router (readwritesplit), confirm that MaxScale routes read queries on this router to replica servers.

    1. On the MaxScale node, use the maxctrl list listeners command to view the available listeners and ports:

    1. In a terminal connected to your application server, use MariaDB Client to connect to the listener port for the Read/Write Split Router (readwritesplit) (in the example, 3307):

    Use the application user credentials you created for the --user and --password options.

    1. Query the hostname and server_id to identify which server MaxScale routed you to.

    1. Resend the query:

    Confirm that MaxScale routes the SELECT statements to different replica servers.

    For more information on different routing criteria, see slave_selection_criteria

    Next Step

    Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

    This page was step 8 of 9.

    Next: Step 9: Import Data

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Deploy ColumnStore Object Storage Topology
    $ maxctrl show maxscale
    ┌──────────────┬───────────────────────────────────────────────────────┐
    │ Version      │ 22.08.15                                              │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Commit       │ 3761fa7a52046bc58faad8b5a139116f9e33364c              │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Started At   │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Activated At │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Uptime       │ 868                                                   │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Config Sync  │ null                                                  │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Parameters   │ {                                                     │
    │              │     "admin_auth": true,                               │
    │              │     "admin_enabled": true,                            │
    │              │     "admin_gui": true,                                │
    │              │     "admin_host": "0.0.0.0",                          │
    │              │     "admin_log_auth_failures": true,                  │
    │              │     "admin_pam_readonly_service": null,               │
    │              │     "admin_pam_readwrite_service": null,              │
    │              │     "admin_port": 8989,                               │
    │              │     "admin_secure_gui": false,                        │
    │              │     "admin_ssl_ca_cert": null,                        │
    │              │     "admin_ssl_cert": null,                           │
    │              │     "admin_ssl_key": null,                            │
    │              │     "admin_ssl_version": "MAX",                       │
    │              │     "auth_connect_timeout": "10000ms",                │
    │              │     "auth_read_timeout": "10000ms",                   │
    │              │     "auth_write_timeout": "10000ms",                  │
    │              │     "cachedir": "/var/cache/maxscale",                │
    │              │     "config_sync_cluster": null,                      │
    │              │     "config_sync_interval": "5000ms",                 │
    │              │     "config_sync_password": "*****",                  │
    │              │     "config_sync_timeout": "10000ms",                 │
    │              │     "config_sync_user": null,                         │
    │              │     "connector_plugindir": "/usr/lib64/mysql/plugin", │
    │              │     "datadir": "/var/lib/maxscale",                   │
    │              │     "debug": null,                                    │
    │              │     "dump_last_statements": "never",                  │
    │              │     "execdir": "/usr/bin",                            │
    │              │     "language": "/var/lib/maxscale",                  │
    │              │     "libdir": "/usr/lib64/maxscale",                  │
    │              │     "load_persisted_configs": true,                   │
    │              │     "local_address": null,                            │
    │              │     "log_debug": false,                               │
    │              │     "log_info": false,                                │
    │              │     "log_notice": true,                               │
    │              │     "log_throttling": {                               │
    │              │         "count": 10,                                  │
    │              │         "suppress": 10000,                            │
    │              │         "window": 1000                                │
    │              │     },                                                │
    │              │     "log_warn_super_user": false,                     │
    │              │     "log_warning": true,                              │
    │              │     "logdir": "/var/log/maxscale",                    │
    │              │     "max_auth_errors_until_block": 10,                │
    │              │     "maxlog": true,                                   │
    │              │     "module_configdir": "/etc/maxscale.modules.d",    │
    │              │     "ms_timestamp": false,                            │
    │              │     "passive": false,                                 │
    │              │     "persistdir": "/var/lib/maxscale/maxscale.cnf.d", │
    │              │     "piddir": "/var/run/maxscale",                    │
    │              │     "query_classifier": "qc_sqlite",                  │
    │              │     "query_classifier_args": null,                    │
    │              │     "query_classifier_cache_size": 289073971,         │
    │              │     "query_retries": 1,                               │
    │              │     "query_retry_timeout": "5000ms",                  │
    │              │     "rebalance_period": "0ms",                        │
    │              │     "rebalance_threshold": 20,                        │
    │              │     "rebalance_window": 10,                           │
    │              │     "retain_last_statements": 0,                      │
    │              │     "session_trace": 0,                               │
    │              │     "skip_permission_checks": false,                  │
    │              │     "sql_mode": "default",                            │
    │              │     "syslog": true,                                   │
    │              │     "threads": 1,                                     │
    │              │     "users_refresh_interval": "0ms",                  │
    │              │     "users_refresh_time": "30000ms",                  │
    │              │     "writeq_high_water": 16777216,                    │
    │              │     "writeq_low_water": 8192                          │
    │              │ }                                                     │
    └──────────────┴───────────────────────────────────────────────────────┘
    $ maxctrl list servers
    ┌────────┬────────────────┬──────┬─────────────┬─────────────────┬────────┐
    │ Server │ Address        │ Port │ Connections │ State           │ GTID   │
    ├────────┼────────────────┼──────┼─────────────┼─────────────────┼────────┤
    │ mcs1   │ 192.0.2.1      │ 3306 │ 1           │ Master, Running │ 0-1-25 │
    ├────────┼────────────────┼──────┼─────────────┼─────────────────┼────────┤
    │ mcs2   │ 192.0.2.2      │ 3306 │ 1           │ Slave, Running  │ 0-1-25 │
    ├────────┼────────────────┼──────┼─────────────┼─────────────────┼────────┤
    │ mcs3   │ 192.0.2.3      │ 3306 │ 1           │ Slave, Running  │ 0-1-25 │
    └────────┴────────────────┴──────┴─────────────┴─────────────────┴────────┘
    $ maxctrl show server mcs1
    ┌─────────────────────┬───────────────────────────────────────────┐
    │ Server              │ mcs1                                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Address             │ 192.0.2.1                                 │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Port                │ 3306                                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ State               │ Master, Running                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Version             │ 11.4.5-3-MariaDB-enterprise-log           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Last Event          │ master_up                                 │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Triggered At        │ Thu, 05 Aug 2021 20:22:26 GMT             │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Services            │ connection_router_service                 │
    │                     │ query_router_service                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Monitors            │ columnstore_monitor                       │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Master ID           │ -1                                        │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Node ID             │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Slave Server IDs    │                                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Current Connections │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Total Connections   │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Max Connections     │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Statistics          │ {                                         │
    │                     │     "active_operations": 0,               │
    │                     │     "adaptive_avg_select_time": "0ns",    │
    │                     │     "connection_pool_empty": 0,           │
    │                     │     "connections": 1,                     │
    │                     │     "max_connections": 1,                 │
    │                     │     "max_pool_size": 0,                   │
    │                     │     "persistent_connections": 0,          │
    │                     │     "reused_connections": 0,              │
    │                     │     "routed_packets": 0,                  │
    │                     │     "total_connections": 1                │
    │                     │ }                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Parameters          │ {                                         │
    │                     │     "address": "192.0.2.1",               │
    │                     │     "disk_space_threshold": null,         │
    │                     │     "extra_port": 0,                      │
    │                     │     "monitorpw": null,                    │
    │                     │     "monitoruser": null,                  │
    │                     │     "persistmaxtime": "0ms",              │
    │                     │     "persistpoolmax": 0,                  │
    │                     │     "port": 3306,                         │
    │                     │     "priority": 0,                        │
    │                     │     "proxy_protocol": false,              │
    │                     │     "rank": "primary",                    │
    │                     │     "socket": null,                       │
    │                     │     "ssl": false,                         │
    │                     │     "ssl_ca_cert": null,                  │
    │                     │     "ssl_cert": null,                     │
    │                     │     "ssl_cert_verify_depth": 9,           │
    │                     │     "ssl_cipher": null,                   │
    │                     │     "ssl_key": null,                      │
    │                     │     "ssl_verify_peer_certificate": false, │
    │                     │     "ssl_verify_peer_host": false,        │
    │                     │     "ssl_version": "MAX"                  │
    │                     │ }                                         │
    └─────────────────────┴───────────────────────────────────────────┘
    $ maxctrl list monitors
    ┌─────────────────────┬─────────┬──────────────────┐
    │ Monitor             │ State   │ Servers          │
    ├─────────────────────┼─────────┼──────────────────┤
    │ columnstore_monitor │ Running │ mcs1, mcs2, mcs3 │
    └─────────────────────┴─────────┴──────────────────┘
    $ maxctrl show monitor columnstore_monitor
    ┌─────────────────────┬─────────────────────────────────────┐
    │ Monitor             │ columnstore_monitor                 │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Module              │ mariadbmon                          │
    ├─────────────────────┼─────────────────────────────────────┤
    │ State               │ Running                             │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Servers             │ mcs1                                │
    │                     │ mcs2                                │
    │                     │ mcs3                                │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Parameters          │ {                                   │
    │                     │     "backend_connect_attempts": 1,  │
    │                     │     "backend_connect_timeout": 3,   │
    │                     │     "backend_read_timeout": 3,      │
    │                     │     "backend_write_timeout": 3,     │
    │                     │     "disk_space_check_interval": 0, │
    │                     │     "disk_space_threshold": null,   │
    │                     │     "events": "all",                │
    │                     │     "journal_max_age": 28800,       │
    │                     │     "module": "mariadbmon",         │
    │                     │     "monitor_interval": 2000,       │
    │                     │     "password": "*****",            │
    │                     │     "script": null,                 │
    │                     │     "script_timeout": 90,           │
    │                     │     "user": "mxs"                   │
    │                     │ }                                   │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Monitor Diagnostics │ {}                                  │
    └─────────────────────┴─────────────────────────────────────┘
    $ maxctrl list services
    ┌───────────────────────────┬────────────────┬─────────────┬───────────────────┬──────────────────┐
    │ Service                   │ Router         │ Connections │ Total Connections │ Servers          │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼──────────────────┤
    │ connection_router_Service │ readconnroute  │ 0           │ 0                 │ mcs1, mcs2, mcs3 │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼──────────────────┤
    │ query_router_service      │ readwritesplit │ 0           │ 0                 │ mcs1, mcs2, mcs3 │
    └───────────────────────────┴────────────────┴─────────────┴───────────────────┴──────────────────┘
    $ maxctrl show service query_router_service
    ┌─────────────────────┬─────────────────────────────────────────────────────────────┐
    │ Service             │ query_router_service                                        │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router              │ readwritesplit                                              │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ State               │ Started                                                     │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Started At          │ Sat Aug 28 21:41:16 2021                                    │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Current Connections │ 0                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Total Connections   │ 0                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Max Connections     │ 0                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Cluster             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Servers             │ mcs1                                                        │
    │                     │ mcs2                                                        │
    │                     │ mcs3                                                        │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Services            │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Filters             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Parameters          │ {                                                           │
    │                     │     "auth_all_servers": false,                              │
    │                     │     "causal_reads": "false",                                │
    │                     │     "causal_reads_timeout": "10000ms",                      │
    │                     │     "connection_keepalive": "300000ms",                     │
    │                     │     "connection_timeout": "0ms",                            │
    │                     │     "delayed_retry": false,                                 │
    │                     │     "delayed_retry_timeout": "10000ms",                     │
    │                     │     "disable_sescmd_history": false,                        │
    │                     │     "enable_root_user": false,                              │
    │                     │     "idle_session_pool_time": "-1000ms",                    │
    │                     │     "lazy_connect": false,                                  │
    │                     │     "localhost_match_wildcard_host": true,                  │
    │                     │     "log_auth_warnings": true,                              │
    │                     │     "master_accept_reads": false,                           │
    │                     │     "master_failure_mode": "fail_instantly",                │
    │                     │     "master_reconnection": false,                           │
    │                     │     "max_connections": 0,                                   │
    │                     │     "max_sescmd_history": 50,                               │
    │                     │     "max_slave_connections": 255,                           │
    │                     │     "max_slave_replication_lag": "0ms",                     │
    │                     │     "net_write_timeout": "0ms",                             │
    │                     │     "optimistic_trx": false,                                │
    │                     │     "password": "*****",                                    │
    │                     │     "prune_sescmd_history": true,                           │
    │                     │     "rank": "primary",                                      │
    │                     │     "retain_last_statements": -1,                           │
    │                     │     "retry_failed_reads": true,                             │
    │                     │     "reuse_prepared_statements": false,                     │
    │                     │     "router": "readwritesplit",                             │
    │                     │     "session_trace": false,                                 │
    │                     │     "session_track_trx_state": false,                       │
    │                     │     "slave_connections": 255,                               │
    │                     │     "slave_selection_criteria": "LEAST_CURRENT_OPERATIONS", │
    │                     │     "strict_multi_stmt": false,                             │
    │                     │     "strict_sp_calls": false,                               │
    │                     │     "strip_db_esc": true,                                   │
    │                     │     "transaction_replay": false,                            │
    │                     │     "transaction_replay_attempts": 5,                       │
    │                     │     "transaction_replay_max_size": 1073741824,              │
    │                     │     "transaction_replay_retry_on_deadlock": false,          │
    │                     │     "type": "service",                                      │
    │                     │     "use_sql_variables_in": "all",                          │
    │                     │     "user": "mxs",                                          │
    │                     │     "version_string": null                                  │
    │                     │ }                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router Diagnostics  │ {                                                           │
    │                     │     "avg_sescmd_history_length": 0,                         │
    │                     │     "max_sescmd_history_length": 0,                         │
    │                     │     "queries": 0,                                           │
    │                     │     "replayed_transactions": 0,                             │
    │                     │     "ro_transactions": 0,                                   │
    │                     │     "route_all": 0,                                         │
    │                     │     "route_master": 0,                                      │
    │                     │     "route_slave": 0,                                       │
    │                     │     "rw_transactions": 0,                                   │
    │                     │     "server_query_statistics": []                           │
    │                     │ }                                                           │
    └─────────────────────┴─────────────────────────────────────────────────────────────┘
    $ sudo mariadb
    CREATE USER 'app_user'@'192.0.2.10' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.10';
    CREATE USER 'app_user'@'192.0.2.11' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.11';
    $ mariadb --host 192.0.2.10 --port 3307
          --user app_user --password
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.10 --port 3308 \
          --user app_user --password
    SELECT @@global.hostname, @@global.server_id;
    
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs2 |                  2 |
    +-------------------+--------------------+
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.10 --port 3307 \
          --user app_user --password
    CREATE TABLE test.load_balancing_test (
       id INT PRIMARY KEY AUTO_INCREMENT,
       hostname VARCHAR(256),
       server_id INT
    );
    INSERT INTO test.load_balancing_test (hostname, server_id)
    VALUES (@@global.hostname, @@global.server_id);
    SELECT * FROM test.load_balancing_test;
    +----+----------+-----------+
    | id | hostname | server_id |
    +----+----------+-----------+
    |  1 | mcs1     |         1 |
    |  2 | mcs1     |         1 |
    |  3 | mcs1     |         1 |
    +----+----------+-----------+
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.10 --port 3307 \
          --user app_user --password
    SELECT @@global.hostname, @@global.server_id;
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs2 |                  2 |
    +-------------------+--------------------+
    SELECT @@global.hostname, @@global.server_id;
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs3 |                  3 |
    +-------------------+--------------------+
    $ maxctrl show maxscale
    ┌──────────────┬───────────────────────────────────────────────────────┐
    │ Version      │ 22.08.15                                              │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Commit       │ 3761fa7a52046bc58faad8b5a139116f9e33364c              │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Started At   │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Activated At │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Uptime       │ 868                                                   │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Config Sync  │ null                                                  │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Parameters   │ {                                                     │
    │              │     "admin_auth": true,                               │
    │              │     "admin_enabled": true,                            │
    │              │     "admin_gui": true,                                │
    │              │     "admin_host": "0.0.0.0",                          │
    │              │     "admin_log_auth_failures": true,                  │
    │              │     "admin_pam_readonly_service": null,               │
    │              │     "admin_pam_readwrite_service": null,              │
    │              │     "admin_port": 8989,                               │
    │              │     "admin_secure_gui": false,                        │
    │              │     "admin_ssl_ca_cert": null,                        │
    │              │     "admin_ssl_cert": null,                           │
    │              │     "admin_ssl_key": null,                            │
    │              │     "admin_ssl_version": "MAX",                       │
    │              │     "auth_connect_timeout": "10000ms",                │
    │              │     "auth_read_timeout": "10000ms",                   │
    │              │     "auth_write_timeout": "10000ms",                  │
    │              │     "cachedir": "/var/cache/maxscale",                │
    │              │     "config_sync_cluster": null,                      │
    │              │     "config_sync_interval": "5000ms",                 │
    │              │     "config_sync_password": "*****",                  │
    │              │     "config_sync_timeout": "10000ms",                 │
    │              │     "config_sync_user": null,                         │
    │              │     "connector_plugindir": "/usr/lib64/mysql/plugin", │
    │              │     "datadir": "/var/lib/maxscale",                   │
    │              │     "debug": null,                                    │
    │              │     "dump_last_statements": "never",                  │
    │              │     "execdir": "/usr/bin",                            │
    │              │     "language": "/var/lib/maxscale",                  │
    │              │     "libdir": "/usr/lib64/maxscale",                  │
    │              │     "load_persisted_configs": true,                   │
    │              │     "local_address": null,                            │
    │              │     "log_debug": false,                               │
    │              │     "log_info": false,                                │
    │              │     "log_notice": true,                               │
    │              │     "log_throttling": {                               │
    │              │         "count": 10,                                  │
    │              │         "suppress": 10000,                            │
    │              │         "window": 1000                                │
    │              │     },                                                │
    │              │     "log_warn_super_user": false,                     │
    │              │     "log_warning": true,                              │
    │              │     "logdir": "/var/log/maxscale",                    │
    │              │     "max_auth_errors_until_block": 10,                │
    │              │     "maxlog": true,                                   │
    │              │     "module_configdir": "/etc/maxscale.modules.d",    │
    │              │     "ms_timestamp": false,                            │
    │              │     "passive": false,                                 │
    │              │     "persistdir": "/var/lib/maxscale/maxscale.cnf.d", │
    │              │     "piddir": "/var/run/maxscale",                    │
    │              │     "query_classifier": "qc_sqlite",                  │
    │              │     "query_classifier_args": null,                    │
    │              │     "query_classifier_cache_size": 289073971,         │
    │              │     "query_retries": 1,                               │
    │              │     "query_retry_timeout": "5000ms",                  │
    │              │     "rebalance_period": "0ms",                        │
    │              │     "rebalance_threshold": 20,                        │
    │              │     "rebalance_window": 10,                           │
    │              │     "retain_last_statements": 0,                      │
    │              │     "session_trace": 0,                               │
    │              │     "skip_permission_checks": false,                  │
    │              │     "sql_mode": "default",                            │
    │              │     "syslog": true,                                   │
    │              │     "threads": 1,                                     │
    │              │     "users_refresh_interval": "0ms",                  │
    │              │     "users_refresh_time": "30000ms",                  │
    │              │     "writeq_high_water": 16777216,                    │
    │              │     "writeq_low_water": 8192                          │
    │              │ }                                                     │
    └──────────────┴───────────────────────────────────────────────────────┘
    $ maxctrl list servers
    ┌────────┬────────────────┬──────┬─────────────┬─────────────────┬────────┐
    │ Server │ Address        │ Port │ Connections │ State           │ GTID   │
    ├────────┼────────────────┼──────┼─────────────┼─────────────────┼────────┤
    │ mcs1   │ 192.0.2.1      │ 3306 │ 1           │ Master, Running │ 0-1-25 │
    ├────────┼────────────────┼──────┼─────────────┼─────────────────┼────────┤
    │ mcs2   │ 192.0.2.2      │ 3306 │ 1           │ Slave, Running  │ 0-1-25 │
    ├────────┼────────────────┼──────┼─────────────┼─────────────────┼────────┤
    │ mcs3   │ 192.0.2.3      │ 3306 │ 1           │ Slave, Running  │ 0-1-25 │
    └────────┴────────────────┴──────┴─────────────┴─────────────────┴────────┘
    $ maxctrl show server mcs1
    ┌─────────────────────┬───────────────────────────────────────────┐
    │ Server              │ mcs1                                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Address             │ 192.0.2.1                                 │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Port                │ 3306                                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ State               │ Master, Running                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Version             │ 11.4.5-3-MariaDB-enterprise-log           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Last Event          │ master_up                                 │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Triggered At        │ Thu, 05 Aug 2021 20:22:26 GMT             │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Services            │ connection_router_service                 │
    │                     │ query_router_service                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Monitors            │ columnstore_monitor                       │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Master ID           │ -1                                        │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Node ID             │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Slave Server IDs    │                                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Current Connections │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Total Connections   │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Max Connections     │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Statistics          │ {                                         │
    │                     │     "active_operations": 0,               │
    │                     │     "adaptive_avg_select_time": "0ns",    │
    │                     │     "connection_pool_empty": 0,           │
    │                     │     "connections": 1,                     │
    │                     │     "max_connections": 1,                 │
    │                     │     "max_pool_size": 0,                   │
    │                     │     "persistent_connections": 0,          │
    │                     │     "reused_connections": 0,              │
    │                     │     "routed_packets": 0,                  │
    │                     │     "total_connections": 1                │
    │                     │ }                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Parameters          │ {                                         │
    │                     │     "address": "192.0.2.1",               │
    │                     │     "disk_space_threshold": null,         │
    │                     │     "extra_port": 0,                      │
    │                     │     "monitorpw": null,                    │
    │                     │     "monitoruser": null,                  │
    │                     │     "persistmaxtime": "0ms",              │
    │                     │     "persistpoolmax": 0,                  │
    │                     │     "port": 3306,                         │
    │                     │     "priority": 0,                        │
    │                     │     "proxy_protocol": false,              │
    │                     │     "rank": "primary",                    │
    │                     │     "socket": null,                       │
    │                     │     "ssl": false,                         │
    │                     │     "ssl_ca_cert": null,                  │
    │                     │     "ssl_cert": null,                     │
    │                     │     "ssl_cert_verify_depth": 9,           │
    │                     │     "ssl_cipher": null,                   │
    │                     │     "ssl_key": null,                      │
    │                     │     "ssl_verify_peer_certificate": false, │
    │                     │     "ssl_verify_peer_host": false,        │
    │                     │     "ssl_version": "MAX"                  │
    │                     │ }                                         │
    └─────────────────────┴───────────────────────────────────────────┘
    $ maxctrl list monitors
    ┌─────────────────────┬─────────┬──────────────────┐
    │ Monitor             │ State   │ Servers          │
    ├─────────────────────┼─────────┼──────────────────┤
    │ columnstore_monitor │ Running │ mcs1, mcs2, mcs3 │
    └─────────────────────┴─────────┴──────────────────┘
    $ maxctrl show monitor columnstore_monitor
    ┌─────────────────────┬─────────────────────────────────────┐
    │ Monitor             │ columnstore_monitor                 │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Module              │ mariadbmon                          │
    ├─────────────────────┼─────────────────────────────────────┤
    │ State               │ Running                             │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Servers             │ mcs1                                │
    │                     │ mcs2                                │
    │                     │ mcs3                                │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Parameters          │ {                                   │
    │                     │     "backend_connect_attempts": 1,  │
    │                     │     "backend_connect_timeout": 3,   │
    │                     │     "backend_read_timeout": 3,      │
    │                     │     "backend_write_timeout": 3,     │
    │                     │     "disk_space_check_interval": 0, │
    │                     │     "disk_space_threshold": null,   │
    │                     │     "events": "all",                │
    │                     │     "journal_max_age": 28800,       │
    │                     │     "module": "mariadbmon",         │
    │                     │     "monitor_interval": 2000,       │
    │                     │     "password": "*****",            │
    │                     │     "script": null,                 │
    │                     │     "script_timeout": 90,           │
    │                     │     "user": "mxs"                   │
    │                     │ }                                   │
    ├─────────────────────┼─────────────────────────────────────┤
    │ Monitor Diagnostics │ {}                                  │
    └─────────────────────┴─────────────────────────────────────┘
    $ maxctrl list services
    ┌───────────────────────────┬────────────────┬─────────────┬───────────────────┬──────────────────┐
    │ Service                   │ Router         │ Connections │ Total Connections │ Servers          │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼──────────────────┤
    │ connection_router_Service │ readconnroute  │ 0           │ 0                 │ mcs1, mcs2, mcs3 │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼──────────────────┤
    │ query_router_service      │ readwritesplit │ 0           │ 0                 │ mcs1, mcs2, mcs3 │
    └───────────────────────────┴────────────────┴─────────────┴───────────────────┴──────────────────┘
    $ maxctrl show service query_router_service
    ┌─────────────────────┬─────────────────────────────────────────────────────────────┐
    │ Service             │ query_router_service                                        │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router              │ readwritesplit                                              │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ State               │ Started                                                     │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Started At          │ Sat Aug 28 21:41:16 2021                                    │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Current Connections │ 0                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Total Connections   │ 0                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Max Connections     │ 0                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Cluster             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Servers             │ mcs1                                                        │
    │                     │ mcs2                                                        │
    │                     │ mcs3                                                        │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Services            │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Filters             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Parameters          │ {                                                           │
    │                     │     "auth_all_servers": false,                              │
    │                     │     "causal_reads": "false",                                │
    │                     │     "causal_reads_timeout": "10000ms",                      │
    │                     │     "connection_keepalive": "300000ms",                     │
    │                     │     "connection_timeout": "0ms",                            │
    │                     │     "delayed_retry": false,                                 │
    │                     │     "delayed_retry_timeout": "10000ms",                     │
    │                     │     "disable_sescmd_history": false,                        │
    │                     │     "enable_root_user": false,                              │
    │                     │     "idle_session_pool_time": "-1000ms",                    │
    │                     │     "lazy_connect": false,                                  │
    │                     │     "localhost_match_wildcard_host": true,                  │
    │                     │     "log_auth_warnings": true,                              │
    │                     │     "master_accept_reads": false,                           │
    │                     │     "master_failure_mode": "fail_instantly",                │
    │                     │     "master_reconnection": false,                           │
    │                     │     "max_connections": 0,                                   │
    │                     │     "max_sescmd_history": 50,                               │
    │                     │     "max_slave_connections": 255,                           │
    │                     │     "max_slave_replication_lag": "0ms",                     │
    │                     │     "net_write_timeout": "0ms",                             │
    │                     │     "optimistic_trx": false,                                │
    │                     │     "password": "*****",                                    │
    │                     │     "prune_sescmd_history": true,                           │
    │                     │     "rank": "primary",                                      │
    │                     │     "retain_last_statements": -1,                           │
    │                     │     "retry_failed_reads": true,                             │
    │                     │     "reuse_prepared_statements": false,                     │
    │                     │     "router": "readwritesplit",                             │
    │                     │     "session_trace": false,                                 │
    │                     │     "session_track_trx_state": false,                       │
    │                     │     "slave_connections": 255,                               │
    │                     │     "slave_selection_criteria": "LEAST_CURRENT_OPERATIONS", │
    │                     │     "strict_multi_stmt": false,                             │
    │                     │     "strict_sp_calls": false,                               │
    │                     │     "strip_db_esc": true,                                   │
    │                     │     "transaction_replay": false,                            │
    │                     │     "transaction_replay_attempts": 5,                       │
    │                     │     "transaction_replay_max_size": 1073741824,              │
    │                     │     "transaction_replay_retry_on_deadlock": false,          │
    │                     │     "type": "service",                                      │
    │                     │     "use_sql_variables_in": "all",                          │
    │                     │     "user": "mxs",                                          │
    │                     │     "version_string": null                                  │
    │                     │ }                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router Diagnostics  │ {                                                           │
    │                     │     "avg_sescmd_history_length": 0,                         │
    │                     │     "max_sescmd_history_length": 0,                         │
    │                     │     "queries": 0,                                           │
    │                     │     "replayed_transactions": 0,                             │
    │                     │     "ro_transactions": 0,                                   │
    │                     │     "route_all": 0,                                         │
    │                     │     "route_master": 0,                                      │
    │                     │     "route_slave": 0,                                       │
    │                     │     "rw_transactions": 0,                                   │
    │                     │     "server_query_statistics": []                           │
    │                     │ }                                                           │
    └─────────────────────┴─────────────────────────────────────────────────────────────┘
    $ sudo mariadb
    CREATE USER 'app_user'@'192.0.2.10' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.10';
    CREATE USER 'app_user'@'192.0.2.11' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.11';
    $ mariadb --host 192.0.2.10 --port 3307
          --user app_user --password
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.10 --port 3308 \
          --user app_user --password
    SELECT @@global.hostname, @@global.server_id;
    
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs2 |                  2 |
    +-------------------+--------------------+
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.10 --port 3307 \
          --user app_user --password
    CREATE TABLE test.load_balancing_test (
       id INT PRIMARY KEY AUTO_INCREMENT,
       hostname VARCHAR(256),
       server_id INT
    );
    INSERT INTO test.load_balancing_test (hostname, server_id)
    VALUES (@@global.hostname, @@global.server_id);
    SELECT * FROM test.load_balancing_test;
    +----+----------+-----------+
    | id | hostname | server_id |
    +----+----------+-----------+
    |  1 | mcs1     |         1 |
    |  2 | mcs1     |         1 |
    |  3 | mcs1     |         1 |
    +----+----------+-----------+
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.10 --port 3307 \
          --user app_user --password
    SELECT @@global.hostname, @@global.server_id;
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs2 |                  2 |
    +-------------------+--------------------+
    SELECT @@global.hostname, @@global.server_id;
    +-------------------+--------------------+
    | @@global.hostname | @@global.server_id |
    +-------------------+--------------------+
    |              mcs3 |                  3 |
    +-------------------+--------------------+

    Set this system variable to ON.

    Set this option to the file you want to use for the Relay Logs. Setting this option enables relay logging.

    Set this option to the file you want to use to index Relay Log filenames.

    Sets the numeric Server ID for this MariaDB Enterprise Server. The value set on this option must be unique to each node.

    iam_role_name, sts_region, and sts_endpoint
    .
  • To use the IAM role assigned to an EC2 instance, you must uncomment ec2_iam_mode=enabled.

  • character_set_server

    Set this system variable to utf8

    collation_server

    Set this system variable to utf8_general_ci

    columnstore_use_import_for_batchinsert

    Set this system variable to ALWAYS to always use cpimport for LOAD DATA INFILE and INSERT...SELECT statements.

    gtid_strict_mode

    Set this system variable to ON.

    log_bin

    Set this option to the file you want to use for the Binary Log. Setting this option enables binary logging.

    log_bin_index

    Set this option to the file you want to use to track binlog filenames.

    Starting and Stopping MariaDB
    Credentials Management for MariaDB Enterprise ColumnStore
    CREATE USER
    GRANT
    GRANT
    How to create an AppArmor Profile

    Set this system variable to ON.

    Set this option to the file you want to use for the Relay Logs. Setting this option enables relay logging.

    Set this option to the file you want to use to index Relay Log filenames.

    Sets the numeric Server ID for this MariaDB Enterprise Server. The value set on this option must be unique to each node.

    character_set_server

    Set this system variable to utf8

    collation_server

    Set this system variable to utf8_general_ci

    columnstore_use_import_for_batchinsert

    Set this system variable to ALWAYS to always use cpimport for LOAD DATA INFILE and INSERT...SELECT statements.

    gtid_strict_mode

    Set this system variable to ON.

    log_bin

    Set this option to the file you want to use for the Binary Log. Setting this option enables binary logging.

    log_bin_index

    Set this option to the file you want to use to track binlog filenames.

    Credentials Management for MariaDB Enterprise ColumnStore
    CREATE USER
    GRANT
    GRANT
    How to create an AppArmor Profile

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Start and Configure MariaDB MaxScale

    Test MariaDB MaxScale

    Import Data

    Storage Requirements
  • S3-Compatible Object Storage Requirements

  • Preferred Object Storage Providers: Cloud

  • Preferred Object Storage Providers: Hardware

  • Shared Local Storage Directories

  • Shared Local Storage Options

  • Recommended Storage Options

  • Ubuntu 18.04 LTS (x86_64)
  • Ubuntu 20.04 LTS (x86_64)

  • NFS (Network File System)

    On-premises

    • NFS is a distributed file system. • If NFS is used, the storage should be mounted with the sync option to ensure that each node flushes its changes immediately. • For on-premises deployments, NFS is the recommended option for the Storage Manager directory, and any S3-compatible storage is the recommended option for data.

    <hostname>-bin

    Enterprise Server 10.5, Enterprise ColumnStore 5, MaxScale 2.5

  • Enterprise Server 10.6, Enterprise ColumnStore 23.02, MaxScale 22.08

  • Step 1

    Prepare ColumnStore Nodes

    Step 2

    Configure Shared Local Storage

    Step 3

    Install MariaDB Enterprise Server

    Step 4

    Start and Configure MariaDB Enterprise Server

    Step 5

    Test MariaDB Enterprise Server

    Step 6

    Install MariaDB MaxScale

    MariaDB Enterprise Server

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    MariaDB MaxScale

    Database proxy that extends the availability, scalability, and security of MariaDB Enterprise Servers

    MariaDB Enterprise ColumnStore

    • Columnar storage engine • Highly available • Optimized for Online Analytical Processing (OLAP) workloads • Scalable query execution • Cluster Management API (CMAPI) provides a REST API for multi-node administration.

    Listener

    Listens for client connections to MaxScale then passes them to the router service

    MariaDB Monitor

    Tracks changes in the state of MariaDB Enterprise Servers.

    Read Connection Router

    Routes connections from the listener to any available Enterprise ColumnStore node

    Read/Write Split Router

    Routes read operations from the listener to any available Enterprise ColumnStore node, and routes write operations from the listener to a specific server that MaxScale uses as the primary server

    Server Module

    Connection configuration in MaxScale to an Enterprise ColumnStore node

    MaxScale node

    4+ cores

    4+ GB

    Enterprise ColumnStore node

    4+ cores

    4+ GB

    MaxScale node

    8+ cores

    16+ GB

    Enterprise ColumnStore node

    64+ cores

    128+ GB

    The ColumnStore Object Storage topology uses shared local storage for the to store metadata.

    EBS (Elastic Block Store) Multi-Attach

    AWS

    • EBS is a high-performance block-storage service for AWS (Amazon Web Services). • EBS Multi-Attach allows an EBS volume to be attached to multiple instances in AWS. Only clustered file systems, such as GFS2, are supported. • For deployments in AWS, EBS Multi-Attach is a recommended option for the Storage Manager directory, and Amazon S3 storage is the recommended option for data.

    EFS (Elastic File System)

    AWS

    • EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services). • For deployments in AWS, EFS is a recommended option for the Storage Manager directory, and Amazon S3 storage is the recommended option for data. EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services).

    Filestore

    GCP

    • Filestore is high-performance, fully managed storage for GCP (Google Cloud Platform). • For deployments in GCP, Filestore is the recommended option for the Storage Manager directory, and Google Object Storage (S3-compatible) is the recommended option for data.

    GlusterFS

    On-premises

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set system-variables and options. The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set system-variables and options.

    SQL

    Users can set system-variables that support dynamic changes on-the-fly using the SET statement.

    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    MariaDB Error Log

    log_error

    <hostname>.err

    MariaDB Enterprise Audit Log

    server_audit_file_path

    server_audit.log

    Slow Query Log

    slow_query_log_file

    <hostname>-slow.log

    General Query Log

    general_log_file

    Start

    sudo systemctl start mariadb-columnstore

    Stop

    sudo systemctl stop mariadb-columnstore

    Restart

    sudo systemctl restart mariadb-columnstore

    Enable during startup

    sudo systemctl enable mariadb-columnstore

    Disable during startup

    sudo systemctl disable mariadb-columnstore

    Status

    sudo systemctl status mariadb-columnstore

    Start

    sudo systemctl start mariadb-columnstore-cmapi

    Stop

    sudo systemctl stop mariadb-columnstore-cmapi

    Restart

    sudo systemctl restart mariadb-columnstore-cmapi

    Enable during startup

    sudo systemctl enable mariadb-columnstore-cmapi

    Disable during startup

    sudo systemctl disable mariadb-columnstore-cmapi

    Status

    sudo systemctl status mariadb-columnstore-cmapi

    MaxCtrl

    Command-line utility to perform administrative tasks through the REST API. See MaxCtrl Commands.

    MaxGUI

    MaxGUI is a graphical utility that can perform administrative tasks through the REST API.

    REST API

    The REST API can be used directly. For example, the curl utility could be used to make REST API calls from the command-line. Many programming languages also have libraries to interact with REST APIs.

    Start

    sudo systemctl start maxscale

    Stop

    sudo systemctl stop maxscale

    Restart

    sudo systemctl restart maxscale

    Enable during startup

    sudo systemctl enable maxscale

    Disable during startup

    sudo systemctl disable maxscale

    Status

    sudo systemctl status maxscale

    shutdown
    start
    status
    Starting and Stopping MariaDB
    REST API

    • GlusterFS is a distributed file system. • GlusterFS supports replication and failover.

    <hostname>.log

    Enterprise Spider storage engine

    Community Server

    Deploy MariaDB Community Server

    Overview

    These instructions detail the deployment of MariaDB Community Server 10.5 in a Single Standalone Server configuration on a range of supported Operating Systems.

    These instructions detail how to deploy a single-node row database, which is suited for a transactional or OLTP workload that does not require high availability (HA). This deployment type is generally for non-production use cases, such as for development and testing.

    MariaDB Community Server Components

    These instructions detail the deployment of the following MariaDB Community Server components:

    Component
    Description

    Term Definitions

    Term
    Definition

    Installation

    MariaDB Corporation provides package repositories for YUM (RHEL, CentOS), APT (Debian, Ubuntu), and ZYpp (SLES).

    Install via YUM (CentOS, RHEL)

    1. Configure the YUM package repository.

      Prefix the version with mariadb- and pass the version string to the --mariadb-server-version flag to . The following directions reference 11.4.

      To configure YUM package repositories:

      1. Checksums of the various releases of the mariadb_repo_setup script can be found in the

    Install via APT (Debian, Ubuntu)

    1. Configure the APT package repository.

      Prefix the version with mariadb- and pass the version string to the --mariadb-server-version flag to . The following directions reference 11.4.

      To configure APT package repositories:

      1. Checksums of the various releases of the mariadb_repo_setup script can be found in the

    Install via ZYpp (SLES)

    1. Configure the ZYpp package repository.

      Prefix the version with mariadb- and pass the version string to the --mariadb-server-version flag to . The following directions reference 11.4.

      To configure ZYpp package repositories:

      1. Checksums of the various releases of the mariadb_repo_setup script can be found in the

    Configuration

    MariaDB Community Server can be configured in the following ways:

    • and can be set in a configuration file (such as /etc/my.cnf). MariaDB Community Server must be restarted to apply changes made to the configuration file.

    • and can be set on the command-line.

    • If a system variable supports dynamic changes, then it can be set on-the-fly using the statement.

    Configuration Files

    MariaDB's packages include several bundled configuration files. It is also possible to create custom configuration files.

    On RHEL, CentOS, and SLES, MariaDB's packages bundle the following configuration files:

    • /etc/my.cnf

    • /etc/my.cnf.d/client.cnf

    • /etc/my.cnf.d/mysql-clients.cnf

    And on RHEL, CentOS, and SLES, custom configuration files from the following directories are read by default:

    • /etc/my.cnf.d/

    On Debian and Ubuntu, MariaDB's packages bundle the following configuration files:

    • /etc/mysql/my.cnf

    • /etc/mysql/mariadb.cnf

    • /etc/mysql/mariadb.conf.d/50-client.cnf

    And on Debian and Ubuntu, custom configuration files from the following directories are read by default:

    • /etc/mysql/conf.d/

    • /etc/mysql/mariadb.conf.d/

    Configuring MariaDB

    1. Determine which and you need to configure.

      Useful system variables and options for MariaDB Community Server include:

    Starting the Server

    MariaDB Community Server includes configuration to start, stop, restart, enable/disable on boot, and check the status of the Server using the operating system default process management system.

    For distributions that use systemd (most supported OSes), you can manage the Server process using the systemctl command:

    Operation
    Command

    Testing

    When MariaDB Community Server is up and running on your system, you should test that it is working and there weren't any issues during startup.

    1. Connect to the Server using using the root@localhost user account:

    Columnstore Object Storage

    Overview

    This procedure describes the deployment of the ColumnStore Object Storage topology with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5.

    MariaDB Enterprise ColumnStore 5 is a columnar storage engine for MariaDB Enterprise Server 10.5. Enterprise ColumnStore is suitable for Online Analytical Processing (OLAP) workloads.

    Step 6: Test MariaDB MaxScale

    Overview

    This page details step 6 of the 6-step procedure "".

    This step tests MariaDB MaxScale.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Installing Enterprise Server

    A guide to installing MariaDB Enterprise Server on various operating systems using package managers (YUM, APT, ZYpp) or binary tarballs.

    Overview

    These instructions detail the deployment of MariaDB Enterprise Server in a Single Standalone Server configuration on a range of supported Operating Systems.

    These instructions detail how to deploy a single-node row database, which is suited for a transactional or OLTP workload that does not require high availability (HA). This deployment type is generally for non-production use cases, such as for development and testing.

    Installing Primary/Replica

    This page explains how to set up a standard Primary/Replica replication topology for MariaDB Enterprise Server.

    Overview

    Software Version
    Diagram
    Features
    $ sudo systemctl stop mariadb
    $ sudo systemctl stop mariadb-columnstore
    $ sudo systemctl stop mariadb-columnstore-cmapi
    [mariadb]
    bind_address                           = 0.0.0.0
    log_error                              = mariadbd.err
    character_set_server                   = utf8
    collation_server                       = utf8_general_ci
    log_bin                                = mariadb-bin
    log_bin_index                          = mariadb-bin.index
    relay_log                              = mariadb-relay
    relay_log_index                        = mariadb-relay.index
    log_slave_updates                      = ON
    gtid_strict_mode                       = ON
    
    # This must be unique on each Enterprise ColumnStore node
    server_id                              = 1
    [ObjectStorage]
    …
    service = S3
    …
    [S3]
    bucket                = your_columnstore_bucket_name
    endpoint              = your_s3_endpoint
    aws_access_key_id     = your_s3_access_key_id
    aws_secret_access_key = your_s3_secret_key
    # iam_role_name       = your_iam_role
    # sts_region          = your_sts_region
    # sts_endpoint        = your_sts_endpoint
    # ec2_iam_mode        = enabled
    
    [Cache]
    cache_size = your_local_cache_size
    path       = your_local_cache_path
    $ sudo systemctl start mariadb
    $ sudo systemctl enable mariadb
    $ sudo systemctl stop mariadb-columnstore
    $ sudo systemctl start mariadb-columnstore-cmapi
    $ sudo systemctl enable mariadb-columnstore-cmapi
    CREATE USER 'util_user'@'127.0.0.1'
    IDENTIFIED BY 'util_user_passwd';
    GRANT SELECT, PROCESS ON *.*
    TO 'util_user'@'127.0.0.1';
    $ sudo mcsSetConfig CrossEngineSupport Host 127.0.0.1
    $ sudo mcsSetConfig CrossEngineSupport Port 3306
    $ sudo mcsSetConfig CrossEngineSupport User util_user
    $ sudo mcsSetConfig CrossEngineSupport Password util_user_passwd
    CREATE USER 'repl'@'192.0.2.%' IDENTIFIED BY 'repl_passwd';
    GRANT REPLICA MONITOR,
       REPLICATION REPLICA,
       REPLICATION REPLICA ADMIN,
       REPLICATION MASTER ADMIN
    ON *.* TO 'repl'@'192.0.2.%';
    CREATE USER 'mxs'@'192.0.2.%'
    IDENTIFIED BY 'mxs_passwd';
    GRANT SHOW DATABASES ON *.* TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.columns_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.db TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.procs_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.proxies_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.roles_mapping TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.tables_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.user TO 'mxs'@'192.0.2.%';
    GRANT BINLOG ADMIN,
       READ_ONLY ADMIN,
       RELOAD,
       REPLICA MONITOR,
       REPLICATION MASTER ADMIN,
       REPLICATION REPLICA ADMIN,
       REPLICATION REPLICA,
       SHOW DATABASES,
       SELECT
    ON *.* TO 'mxs'@'192.0.2.%';
    CHANGE MASTER TO
       MASTER_HOST='192.0.2.1',
       MASTER_USER='repl',
       MASTER_PASSWORD='repl_passwd',
       MASTER_USE_GTID=slave_pos;
    START REPLICA;
    SHOW REPLICA STATUS;
    SET GLOBAL read_only=ON;
    $ openssl rand -hex 32
    
    93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       --data '{"timeout":120, "node": "192.0.2.1"}' \
       | jq .
    {
      "timestamp": "2020-10-28 00:39:14.672142",
      "node_id": "192.0.2.1"
    }
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      }
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       --data '{"timeout":120, "node": "192.0.2.2"}' \
       | jq .
    {
      "timestamp": "2020-10-28 00:42:42.796050",
      "node_id": "192.0.2.2"
    }
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      },
      "192.0.2.2": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "192.0.2.3": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "num_nodes": 3
    }
    $ sudo yum install policycoreutils policycoreutils-python
    $ sudo yum install policycoreutils python3-policycoreutils policycoreutils-python-utils
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    
    Nothing to do
    $ sudo semodule -i mariadb_local.pp
    $ sudo setenforce enforcing
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    Enforcing
    $ sudo systemctl status firewalld
    $ sudo systemctl start firewalld
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="3306" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8600-8630" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8640" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8700" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8800" protocol="tcp"
       accept'
    $ sudo firewall-cmd --reload
    $ sudo ufw status verbose
    $ sudo ufw enable
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 3306 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8600:8630 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8640 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8700 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8800 proto tcp
    $ sudo ufw reload
    $ sudo systemctl stop mariadb
    $ sudo systemctl stop mariadb-columnstore
    $ sudo systemctl stop mariadb-columnstore-cmapi
    [mariadb]
    bind_address                           = 0.0.0.0
    log_error                              = mariadbd.err
    character_set_server                   = utf8
    collation_server                       = utf8_general_ci
    log_bin                                = mariadb-bin
    log_bin_index                          = mariadb-bin.index
    relay_log                              = mariadb-relay
    relay_log_index                        = mariadb-relay.index
    log_slave_updates                      = ON
    gtid_strict_mode                       = ON
    
    # This must be unique on each Enterprise ColumnStore node
    server_id                              = 1
    $ sudo systemctl start mariadb
    $ sudo systemctl enable mariadb
    $ sudo systemctl stop mariadb-columnstore
    $ sudo systemctl start mariadb-columnstore-cmapi
    $ sudo systemctl enable mariadb-columnstore-cmapi
    CREATE USER 'util_user'@'127.0.0.1'
    IDENTIFIED BY 'util_user_passwd';
    GRANT SELECT, PROCESS ON *.*
    TO 'util_user'@'127.0.0.1';
    $ sudo mcsSetConfig CrossEngineSupport Host 127.0.0.1
    $ sudo mcsSetConfig CrossEngineSupport Port 3306
    $ sudo mcsSetConfig CrossEngineSupport User util_user
    $ sudo mcsSetConfig CrossEngineSupport Password util_user_passwd
    CREATE USER 'repl'@'192.0.2.%' IDENTIFIED BY 'repl_passwd';
    GRANT REPLICA MONITOR,
       REPLICATION REPLICA,
       REPLICATION REPLICA ADMIN,
       REPLICATION MASTER ADMIN
    ON *.* TO 'repl'@'192.0.2.%';
    CREATE USER 'mxs'@'192.0.2.%'
    IDENTIFIED BY 'mxs_passwd';
    GRANT SHOW DATABASES ON *.* TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.columns_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.db TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.procs_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.proxies_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.roles_mapping TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.tables_priv TO 'mxs'@'192.0.2.%';
    
    GRANT SELECT ON mysql.user TO 'mxs'@'192.0.2.%';
    GRANT BINLOG ADMIN,
       READ_ONLY ADMIN,
       RELOAD,
       REPLICA MONITOR,
       REPLICATION MASTER ADMIN,
       REPLICATION REPLICA ADMIN,
       REPLICATION REPLICA,
       SHOW DATABASES,
       SELECT
    ON *.* TO 'mxs'@'192.0.2.%';
    CHANGE MASTER TO
       MASTER_HOST='192.0.2.1',
       MASTER_USER='repl',
       MASTER_PASSWORD='repl_passwd',
       MASTER_USE_GTID=slave_pos;
    START REPLICA;
    SHOW REPLICA STATUS;
    SET GLOBAL read_only=ON;
    $ openssl rand -hex 32
    
    93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       --data '{"timeout":120, "node": "192.0.2.1"}' \
       | jq .
    {
      "timestamp": "2020-10-28 00:39:14.672142",
      "node_id": "192.0.2.1"
    }
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      }
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       --data '{"timeout":120, "node": "192.0.2.2"}' \
       | jq .
    {
      "timestamp": "2020-10-28 00:42:42.796050",
      "node_id": "192.0.2.2"
    }
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
       --header 'Content-Type:application/json' \
       --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
       | jq .
    {
      "timestamp": "2020-12-15 00:40:34.353574",
      "192.0.2.1": {
        "timestamp": "2020-12-15 00:40:34.362374",
        "uptime": 11467,
        "dbrm_mode": "master",
        "cluster_mode": "readwrite",
        "dbroots": [
          "1"
        ],
        "module_id": 1,
        "services": [
          {
            "name": "workernode",
            "pid": 19202
          },
          {
            "name": "controllernode",
            "pid": 19232
          },
          {
            "name": "PrimProc",
            "pid": 19254
          },
          {
            "name": "ExeMgr",
            "pid": 19292
          },
          {
            "name": "WriteEngine",
            "pid": 19316
          },
          {
            "name": "DMLProc",
            "pid": 19332
          },
          {
            "name": "DDLProc",
            "pid": 19366
          }
        ]
      },
      "192.0.2.2": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "192.0.2.3": {
        "timestamp": "2020-12-15 00:40:34.428554",
        "uptime": 11437,
        "dbrm_mode": "slave",
        "cluster_mode": "readonly",
        "dbroots": [
          "2"
        ],
        "module_id": 2,
        "services": [
          {
            "name": "workernode",
            "pid": 17789
          },
          {
            "name": "PrimProc",
            "pid": 17813
          },
          {
            "name": "ExeMgr",
            "pid": 17854
          },
          {
            "name": "WriteEngine",
            "pid": 17877
          }
        ]
      },
      "num_nodes": 3
    }
    $ sudo yum install policycoreutils policycoreutils-python
    $ sudo yum install policycoreutils python3-policycoreutils policycoreutils-python-utils
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    
    Nothing to do
    $ sudo semodule -i mariadb_local.pp
    $ sudo setenforce enforcing
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    Enforcing
    $ sudo systemctl status firewalld
    $ sudo systemctl start firewalld
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="3306" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8600-8630" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8640" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8700" protocol="tcp"
       accept'
    $ sudo firewall-cmd --permanent --add-rich-rule='
       rule family="ipv4"
       source address="192.0.2.0/24"
       destination address="192.0.2.0/24"
       port port="8800" protocol="tcp"
       accept'
    $ sudo firewall-cmd --reload
    $ sudo ufw status verbose
    $ sudo ufw enable
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 3306 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8600:8630 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8640 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8700 proto tcp
    
    $ sudo ufw allow from 192.0.2.0/24 to 192.0.2.3 port 8800 proto tcp
    $ sudo ufw reload
    Apr 30 21:54:35 a1ebc96a2519 PrimProc[1004]: 35.668435 |0|0|0| C 28 CAL0000: Error total memory available is less than 3GB.
    ERROR 1815 (HY000): Internal error: System is not ready yet. Please try again.
    https://{server}:{port}/cmapi/{version}/{route}/{command}
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/start \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/shutdown \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ curl -k -s -X DELETE https://mcs1:8640/cmapi/0.4.0/cluster/node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    Check Global Configuration

    Use maxctrl show maxscale command to view the global MaxScale configuration.

    This action is performed on the MaxScale node:

    Output should align to the global MaxScale configuration in the new configuration file you created.

    Check Server Configuration

    Use the maxctrl list servers and maxctrl show server commands to view the configured server objects.

    This action is performed on the MaxScale node:

    1. Obtain the full list of servers objects:

    1. For each server object, view the configuration:

    Output should align to the Server Object configuration you performed.

    Check Monitor Configuration

    Use the maxctrl list monitors and maxctrl show monitor commands to view the configured monitors.

    This action is performed on the MaxScale node:

    1. Obtain the full list of monitors:

    1. For each monitor, view the monitor configuration:

    Output should align to the Galera Monitor (galeramon) configuration you performed.

    Check Service Configuration

    Use the maxctrl list services and maxctrl show service commands to view the configured routing services.

    This action is performed on the MaxScale node:

    1. Obtain the full list of routing services:

    1. For each service, view the service configuration:

    Output should align to the Read Connection Router (readconnroute) or Read/Write Split Router (readwritesplit) configuration you performed.

    Test Application User

    Applications should use a dedicated user account. The user account must be created on the primary server.

    When users connect to MaxScale, MaxScale authenticates the user connection before routing it to an Enterprise Server node. Enterprise Server authenticates the connection as originating from the IP address of the MaxScale node.

    The application users must have one user account with the host IP address of the application server and a second user account with the host IP address of the MaxScale node.

    The requirement of a duplicate user account can be avoided by enabling the proxy_protocol parameter for MaxScale and the proxy_protocol_networks for Enterprise Server.

    Create a User to Connect from MaxScale

    This action is performed on any Enterprise Cluster node:

    1. Connect to the node:

    1. Create the database user account for your MaxScale node:

    Replace 192.0.2.104 with the relevant IP address specification for your MaxScale node.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the database user account for your MaxScale node:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Create a User to Connect from the Application Server

    This action is performed on any Enterprise Cluster node:

    1. Create the database user account for your application server:

    Replace 192.0.2.11 with the relevant IP address specification for your application server.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the database user account for your application server:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Test Connection with Application User

    To test the connection, use the MariaDB Client from your application server to connect to an Enterprise Cluster node through MaxScale.

    This action is performed on the application server:

    Test Connection with Read Connection Router

    If you configured the Read Connection Router, confirm that MaxScale routes connections to the replica servers.

    1. On the MaxScale node, use the maxctrl list listeners command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each use MariaDB Client to connect to the listener port for the Read Connection Router (in the example 3308):

    Use the application user credentials you created for the --user and --password options.

    1. In each terminal, query the hostname system variable to identify to which you're connected:

    Different terminals should return different values since MaxScale routes the connections to different nodes.

    Since the router was configured the slave router option, the Read Connection Router only routes connections to replica servers.

    Test Write Queries with the Read/Write Split Router

    If you configured the Read/Write Split Router, confirm that readwritesplit correctly routes write queries.

    This action is performed with multiple client connections to the MaxScale node.

    1. On the MaxScale node, use the maxctrl list servers command to identify the Enterprise Cluster node currently operating as the primary server:

    The server listed as Master is currently operating as the primary server.

    1. On the MaxScale node, use the maxctrl list listeners command to identify the correct listener port:

    In the example, the listener port for the Read/Write Split router is 3307.

    1. Use the MariaDB Client to establish multiple connections to the listener configured for the Read/Write Split routing service, query_router_listener, on the MaxScale node:

    The database user account for your application server should be specified by the --user option.

    1. Using any client connection, create a test table:

    1. Using each client connection, insert the values of the hostname system variable into the table using the INSERT statement to identify the node that executes the statement:

    1. Using any client connection, query the table using the SELECT statement:

    The output shows the hostname from the Enterprise Cluster node operating as the primary server. (Enterprise Cluster offsets auto-increment values by node to avoid write conflicts.)

    Confirm that MaxScale is routing write queries to the Enterprise Cluster node operating as the primary server by checking that the test table only contains the hostname of the correct Enterprise Cluster node.

    Test Read Queries with the Read/Write Split Router

    If you configured the Read/Write Split Router, confirm that readwritesplit properly routes read queries to multiple replica servers.

    This action is performed with multiple clients connected to the MaxScale node.

    1. On the MaxScale node, use maxctrl list servers to identify the Enterprise Cluster nodes that are currently operating as replica servers:

    The servers listed as Slave are currently operating as replica servers.

    1. On the MaxScale node, use the maxctrl list listeners command to identify the correct listener port:

    In the example, the listener port for the Read/Write Split router is 3307.

    1. Use the MariaDB Client to establish multiple connections to query_router_listener which is the listener configured for the Read/Write Split routing service on the MaxScale node:

    The database user account for your application server should be specified by the --user option.

    1. Using each client connection, query the hostname system variable to identify the node that executes the statement:

    The output shows the hostname value from one of the Enterprise Cluster nodes operating as replica servers.

    Confirm that MaxScale is routing read queries to multiple Enterprise Cluster nodes operating as replica servers by checking that different client connections return different hostname values.

    For more information on different routing criteria, slave_selection_criteria

    Next Step

    Navigation in the procedure "Deploy Galera Cluster Topology":

    This page was step 6 of 6.

    This procedure is complete.

    Deploy Galera Cluster Topology

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    $ maxctrl show maxscale
    ┌──────────────┬───────────────────────────────────────────────────────┐
    │ Version      │ 25.01.2                                               │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Commit       │ 3761fa7a52046bc58faad8b5a139116f9e33364c              │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Started At   │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Activated At │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Uptime       │ 868                                                   │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Config Sync  │ null                                                  │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Parameters   │ {                                                     │
    │              │     "admin_auth": true,                               │
    │              │     "admin_enabled": true,                            │
    │              │     "admin_gui": true,                                │
    │              │     "admin_host": "0.0.0.0",                          │
    │              │     "admin_log_auth_failures": true,                  │
    │              │     "admin_pam_readonly_service": null,               │
    │              │     "admin_pam_readwrite_service": null,              │
    │              │     "admin_port": 8989,                               │
    │              │     "admin_secure_gui": false,                        │
    │              │     "admin_ssl_ca_cert": null,                        │
    │              │     "admin_ssl_cert": null,                           │
    │              │     "admin_ssl_key": null,                            │
    │              │     "admin_ssl_version": "MAX",                       │
    │              │     "auth_connect_timeout": "10000ms",                │
    │              │     "auth_read_timeout": "10000ms",                   │
    │              │     "auth_write_timeout": "10000ms",                  │
    │              │     "cachedir": "/var/cache/maxscale",                │
    │              │     "config_sync_cluster": null,                      │
    │              │     "config_sync_interval": "5000ms",                 │
    │              │     "config_sync_password": "*****",                  │
    │              │     "config_sync_timeout": "10000ms",                 │
    │              │     "config_sync_user": null,                         │
    │              │     "connector_plugindir": "/usr/lib64/mysql/plugin", │
    │              │     "datadir": "/var/lib/maxscale",                   │
    │              │     "debug": null,                                    │
    │              │     "dump_last_statements": "never",                  │
    │              │     "execdir": "/usr/bin",                            │
    │              │     "language": "/var/lib/maxscale",                  │
    │              │     "libdir": "/usr/lib64/maxscale",                  │
    │              │     "load_persisted_configs": true,                   │
    │              │     "local_address": null,                            │
    │              │     "log_debug": false,                               │
    │              │     "log_info": false,                                │
    │              │     "log_notice": true,                               │
    │              │     "log_throttling": {                               │
    │              │         "count": 10,                                  │
    │              │         "suppress": 10000,                            │
    │              │         "window": 1000                                │
    │              │     },                                                │
    │              │     "log_warn_super_user": false,                     │
    │              │     "log_warning": true,                              │
    │              │     "logdir": "/var/log/maxscale",                    │
    │              │     "max_auth_errors_until_block": 10,                │
    │              │     "maxlog": true,                                   │
    │              │     "module_configdir": "/etc/maxscale.modules.d",    │
    │              │     "ms_timestamp": false,                            │
    │              │     "passive": false,                                 │
    │              │     "persistdir": "/var/lib/maxscale/maxscale.cnf.d", │
    │              │     "piddir": "/var/run/maxscale",                    │
    │              │     "query_classifier": "qc_sqlite",                  │
    │              │     "query_classifier_args": null,                    │
    │              │     "query_classifier_cache_size": 289073971,         │
    │              │     "query_retries": 1,                               │
    │              │     "query_retry_timeout": "5000ms",                  │
    │              │     "rebalance_period": "0ms",                        │
    │              │     "rebalance_threshold": 20,                        │
    │              │     "rebalance_window": 10,                           │
    │              │     "retain_last_statements": 0,                      │
    │              │     "session_trace": 0,                               │
    │              │     "skip_permission_checks": false,                  │
    │              │     "sql_mode": "default",                            │
    │              │     "syslog": true,                                   │
    │              │     "threads": 1,                                     │
    │              │     "users_refresh_interval": "0ms",                  │
    │              │     "users_refresh_time": "30000ms",                  │
    │              │     "writeq_high_water": 16777216,                    │
    │              │     "writeq_low_water": 8192                          │
    │              │ }                                                     │
    └──────────────┴───────────────────────────────────────────────────────┘
    $ maxctrl list servers
    ┌────────┬─────────────┬──────┬─────────────┬─────────────────────────┬──────┐
    │ Server │ Address     │ Port │ Connections │ State                   │ GTID │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node1  │ 192.0.2.101 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node2  │ 192.0.2.102 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node3  │ 192.0.2.103 │ 3306 │ 0           │ Master, Synced, Running │      │
    └────────┴─────────────┴──────┴─────────────┴─────────────────────────┴──────┘
    $ maxctrl show server node3
    ┌─────────────────────┬───────────────────────────────────────────┐
    │ Server              │ node3                                     │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Address             │ 192.0.2.103                               │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Port                │ 3306                                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ State               │ Master, Synced, Running                   │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Version             │ 11.4.5-3-MariaDB-enterprise-log           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Last Event          │ master_up                                 │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Triggered At        │ Thu, 05 Aug 2021 20:22:26 GMT             │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Services            │ connection_router_service                 │
    │                     │ query_router_service                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Monitors            │ cluster_monitor                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Master ID           │ -1                                        │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Node ID             │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Slave Server IDs    │                                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Current Connections │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Total Connections   │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Max Connections     │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Statistics          │ {                                         │
    │                     │     "active_operations": 0,               │
    │                     │     "adaptive_avg_select_time": "0ns",    │
    │                     │     "connection_pool_empty": 0,           │
    │                     │     "connections": 1,                     │
    │                     │     "max_connections": 1,                 │
    │                     │     "max_pool_size": 0,                   │
    │                     │     "persistent_connections": 0,          │
    │                     │     "reused_connections": 0,              │
    │                     │     "routed_packets": 0,                  │
    │                     │     "total_connections": 1                │
    │                     │ }                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Parameters          │ {                                         │
    │                     │     "address": "192.0.2.103",               │
    │                     │     "disk_space_threshold": null,         │
    │                     │     "extra_port": 0,                      │
    │                     │     "monitorpw": null,                    │
    │                     │     "monitoruser": null,                  │
    │                     │     "persistmaxtime": "0ms",              │
    │                     │     "persistpoolmax": 0,                  │
    │                     │     "port": 3306,                         │
    │                     │     "priority": 0,                        │
    │                     │     "proxy_protocol": false,              │
    │                     │     "rank": "primary",                    │
    │                     │     "socket": null,                       │
    │                     │     "ssl": false,                         │
    │                     │     "ssl_ca_cert": null,                  │
    │                     │     "ssl_cert": null,                     │
    │                     │     "ssl_cert_verify_depth": 9,           │
    │                     │     "ssl_cipher": null,                   │
    │                     │     "ssl_key": null,                      │
    │                     │     "ssl_verify_peer_certificate": false, │
    │                     │     "ssl_verify_peer_host": false,        │
    │                     │     "ssl_version": "MAX"                  │
    │                     │ }                                         │
    └─────────────────────┴───────────────────────────────────────────┘
    $ maxctrl list monitors
    ┌─────────────────┬─────────┬─────────────────────┐
    │ Monitor         │ State   │ Servers             │
    ├─────────────────┼─────────┼─────────────────────┤
    │ cluster_monitor │ Running │ node1, node2, node3 │
    └─────────────────┴─────────┴─────────────────────┘
    $ maxctrl show monitor cluster_monitor
    ┌─────────────────────┬──────────────────────────────────────────────────────┐
    │ Monitor             │ cluster_monitor                                      │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Module              │ galeramon                                            │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ State               │ Running                                              │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Servers             │ node1                                                │
    │                     │ node2                                                │
    │                     │ node3                                                │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Parameters          │ {                                                    │
    │                     │     ..                                               │
    │                     │ }                                                    │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Monitor Diagnostics │ {                                                    │
    │                     │     ..                                               │
    │                     │ }                                                    │
    └─────────────────────┴──────────────────────────────────────────────────────┘
    $ maxctrl list services
    ┌───────────────────────────┬────────────────┬─────────────┬───────────────────┬─────────────────────┐
    │ Service                   │ Router         │ Connections │ Total Connections │ Servers             │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼─────────────────────┤
    │ connection_router_service │ readconnroute  │ 0           │ 0                 │ node1, node2, node3 │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼─────────────────────┤
    │ query_router_service      │ readwritesplit │ 1           │ 1                 │ node1, node2, node3 │
    └───────────────────────────┴────────────────┴─────────────┴───────────────────┴─────────────────────┘
    $ maxctrl show service query_router_service
    ┌─────────────────────┬─────────────────────────────────────────────────────────────┐
    │ Service             │ query_router_service                                        │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router              │ readwritesplit                                              │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ State               │ Started                                                     │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Started At          │ Thu Aug  5 20:23:38 2021                                    │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Current Connections │ 1                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Total Connections   │ 1                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Max Connections     │ 1                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Cluster             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Servers             │ node1                                                       │
    │                     │ node2                                                       │
    │                     │ node3                                                       │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Services            │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Filters             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Parameters          │ {                                                           │
    │                     │     "auth_all_servers": false,                              │
    │                     │     "causal_reads": "false",                                │
    │                     │     "causal_reads_timeout": "10000ms",                      │
    │                     │     "connection_keepalive": "300000ms",                     │
    │                     │     "connection_timeout": "0ms",                            │
    │                     │     "delayed_retry": false,                                 │
    │                     │     "delayed_retry_timeout": "10000ms",                     │
    │                     │     "disable_sescmd_history": false,                        │
    │                     │     "enable_root_user": false,                              │
    │                     │     "idle_session_pool_time": "-1000ms",                    │
    │                     │     "lazy_connect": false,                                  │
    │                     │     "localhost_match_wildcard_host": true,                  │
    │                     │     "log_auth_warnings": true,                              │
    │                     │     "master_accept_reads": false,                           │
    │                     │     "master_failure_mode": "fail_instantly",                │
    │                     │     "master_reconnection": false,                           │
    │                     │     "max_connections": 0,                                   │
    │                     │     "max_sescmd_history": 50,                               │
    │                     │     "max_slave_connections": 255,                           │
    │                     │     "max_slave_replication_lag": "0ms",                     │
    │                     │     "net_write_timeout": "0ms",                             │
    │                     │     "optimistic_trx": false,                                │
    │                     │     "password": "*****",                                    │
    │                     │     "prune_sescmd_history": true,                           │
    │                     │     "rank": "primary",                                      │
    │                     │     "retain_last_statements": -1,                           │
    │                     │     "retry_failed_reads": true,                             │
    │                     │     "reuse_prepared_statements": false,                     │
    │                     │     "router": "readwritesplit",                             │
    │                     │     "session_trace": false,                                 │
    │                     │     "session_track_trx_state": false,                       │
    │                     │     "slave_connections": 255,                               │
    │                     │     "slave_selection_criteria": "LEAST_CURRENT_OPERATIONS", │
    │                     │     "strict_multi_stmt": false,                             │
    │                     │     "strict_sp_calls": false,                               │
    │                     │     "strip_db_esc": true,                                   │
    │                     │     "transaction_replay": false,                            │
    │                     │     "transaction_replay_attempts": 5,                       │
    │                     │     "transaction_replay_max_size": 1073741824,              │
    │                     │     "transaction_replay_retry_on_deadlock": false,          │
    │                     │     "type": "service",                                      │
    │                     │     "use_sql_variables_in": "all",                          │
    │                     │     "user": "mxs",                                          │
    │                     │     "version_string": null                                  │
    │                     │ }                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router Diagnostics  │ {                                                           │
    │                     │     "avg_sescmd_history_length": 0,                         │
    │                     │     "max_sescmd_history_length": 0,                         │
    │                     │     "queries": 1,                                           │
    │                     │     "replayed_transactions": 0,                             │
    │                     │     "ro_transactions": 0,                                   │
    │                     │     "route_all": 0,                                         │
    │                     │     "route_master": 0,                                      │
    │                     │     "route_slave": 1,                                       │
    │                     │     "rw_transactions": 0,                                   │
    │                     │     "server_query_statistics": [                            │
    │                     │         {                                                   │
    │                     │             "avg_selects_per_session": 0,                   │
    │                     │             "avg_sess_duration": "0ns",                     │
    │                     │             "id": "node2",                                  │
    │                     │             "read": 1,                                      │
    │                     │             "total": 1,                                     │
    │                     │             "write": 0                                      │
    │                     │         }                                                   │
    │                     │     ]                                                       │
    │                     │ }                                                           │
    └─────────────────────┴─────────────────────────────────────────────────────────────┘
    $ sudo mariadb
    CREATE USER 'app_user'@'192.0.2.104' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.104';
    CREATE USER 'app_user'@'192.0.2.11' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.11';
    $ mariadb --host 192.0.2.104 --port 3307
          --user app_user --password
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.104 --port 3308 \
          --user app_user --password
    SELECT @@global.hostname;
    
    +-------------------+
    | @@global.hostname |
    +-------------------+
    |             node2 |
    +-------------------+
    $ maxctrl list servers
    ┌────────┬─────────────┬──────┬─────────────┬─────────────────────────┬──────┐
    │ Server │ Address     │ Port │ Connections │ State                   │ GTID │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node1  │ 192.0.2.101 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node2  │ 192.0.2.102 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node3  │ 192.0.2.103 │ 3306 │ 0           │ Master, Synced, Running │      │
    └────────┴─────────────┴──────┴─────────────┴─────────────────────────┴──────┘
    $ maxctrl list listeners galerarouter
    ┌────────────────────────────┬──────┬───────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host  │ State   │ Service                   │
    ├────────────────────────────┼──────┼───────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │       │ Running │ connection_router_service │
    │ query_router_listener      │ 3307 │       │ Running │ query_router_service      │
    └────────────────────────────┴──────┴───────┴─────────┴───────────────────────────┘
    $ mariadb --host=192.0.2.104 --port=3307 \
          --user=app_user --password=app_user_passwd
    CREATE TABLE test.load_balancing_test (
       id INT PRIMARY KEY AUTO_INCREMENT,
       hostname VARCHAR(256)
    );
    INSERT INTO test.load_balancing_test (hostname)
    VALUES (@@global.hostname);
    SELECT * FROM test.load_balancing_test;
    +----+----------+
    | id | hostname |
    +----+----------+
    |  1 | node3    |
    |  4 | node3    |
    |  7 | node3    |
    +----+----------+
    $ maxctrl list servers
    ┌────────┬─────────────┬──────┬─────────────┬─────────────────────────┬──────┐
    │ Server │ Address     │ Port │ Connections │ State                   │ GTID │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node1  │ 192.0.2.101 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node2  │ 192.0.2.102 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node3  │ 192.0.2.103 │ 3306 │ 0           │ Master, Synced, Running │      │
    └────────┴─────────────┴──────┴─────────────┴─────────────────────────┴──────┘
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬───────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host  │ State   │ Service                   │
    ├────────────────────────────┼──────┼───────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │       │ Running │ connection_router_service │
    │ query_router_listener      │ 3307 │       │ Running │ query_router_service      │
    └────────────────────────────┴──────┴───────┴─────────┴───────────────────────────┘
    $ mariadb --host=192.0.2.104 --port=3307 \
       --user=app_user --password=app_user_passwd
    SELECT @@global.hostname;
    
    +-------------------+
    | @@global.hostname |
    +-------------------+
    |             node2 |
    +-------------------+
    section at the bottom of the
    page. Substitute ${checksum} in the example above with the latest checksum.
  • Install MariaDB Community Server and package dependencies:

  • Configure MariaDB.

    Installation only loads MariaDB Community Server to the system. MariaDB Community Server requires configuration before the database server is ready for use.

    See Configuration.

  • section at the bottom of the
    page. Substitute ${checksum} in the example above with the latest checksum.
  • Install MariaDB Community Server and package dependencies:

  • Configure MariaDB.

    Installation only loads MariaDB Community Server to the system. MariaDB Community Server requires configuration before the database server is ready for use.

    See Configuration.

  • section at the bottom of the
    page. Substitute ${checksum} in the example above with the latest checksum.
  • Install MariaDB Community Server and package dependencies:

  • Configure MariaDB.

    Installation only loads MariaDB Community Server to the system. MariaDB Community Server requires configuration before the database server is ready for use.

    See Configuration.

  • /etc/my.cnf.d/server.cnf
    /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
  • /etc/mysql/mariadb.conf.d/50-mysqld_safe.cnf

  • /etc/mysql/mariadb.conf.d/50-server.cnf

  • /etc/mysql/mariadb.conf.d/60-galera.cnf

  • Sets the maximum number of simultaneous connections MariaDB Community Server allows.

    Sets how MariaDB Community Server handles threads for client connections.

    Sets the file name for the error log.

    Sets the amount of memory InnoDB reserves for the Buffer Pool.

    Sets the size for each Redo Log file and sets the number of Redo Log files used by InnoDB.

    Sets the maximum number of I/O operations per second that InnoDB can use.

  • Choose a configuration file in which to configure your system variables and options.

    It is not recommended to make custom changes to one of the bundled configuration files. Instead, it is recommended to create a custom configuration file in one of the included directories. Configuration files in included directories are read in alphabetical order. If you want your custom configuration file to override the bundled configuration files, then it is a good idea to prefix the custom configuration file's name with a string that will be sorted last, such as z-.

    • On RHEL, CentOS, and SLES, a good custom configuration file would be: /etc/my.cnf.d/z-custom-my.cnf

    • On Debian and Ubuntu, a good custom configuration file would be: /etc/mysql/mariadb.conf.d/z-custom-my.cnf

  • Set your system variables and options in the configuration file.

    They need to be set in a group that will be read by mariadbd, such as [mariadb] or [server].

    For example:

  • InnoDB

    • It is a general purpose storage engine.

    • It is ACID-compliant.

    • It is performant.

    • It is the transactional component of MariaDB's single stack Hybrid Transactional/Analytical Processing (HTAP) solution.

    row database

    • A database where all columns of each row are stored together.

    • Best suited for transactional and OLTP workloads.

    • Also known as a "row-oriented database".

    System Variable/Option

    Description

    datadir

    Sets the path to the data directory. MariaDB Community Server writes data files to this directory, including tablespaces, logs, and schemas. Change it to use a non-standard location or to start the Server on a different data directory for testing.

    bind_address

    Sets the local TCP/IP address on which MariaDB Community Server listens for incoming connections. When testing on a local system, bind the address to the local host at 127.0.0.1 to prevent network access.

    port

    Sets the port MariaDB Community Server listens on. Use this system variable to use a non-standard port or when running multiple Servers on the same host for testing.

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    mariadb_repo_setup
    mariadb_repo_setup
    mariadb_repo_setup
    System variables
    options
    System variables
    options
    SET
    system variables
    options
    mariadb Client

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Versions
    MariaDB Package Repository Setup and Usage
    Versions
    MariaDB Package Repository Setup and Usage
    Versions
    MariaDB Package Repository Setup and Usage
    This procedure has 9 steps, which are executed in sequence.

    This procedure represents basic product capability and deploys 3 Enterprise ColumnStore nodes and 1 MaxScale node.

    This page provides an overview of the topology, requirements, and deployment procedures.

    Please read and understand this procedure before executing.

    Procedure Steps

    Step
    Description

    Prepare ColumnStore Nodes

    Configure Shared Local Storage

    Install MariaDB Enterprise Server

    Start and Configure MariaDB Enterprise Server

    Test MariaDB Enterprise Server

    Install MariaDB MaxScale

    Support

    Customers can obtain support by submitting a support case.

    Components

    The following components are deployed during this procedure:

    Component
    Function

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    Database proxy that extends the availability, scalability, and security of MariaDB Enterprise Servers

    MariaDB Enterprise Server Components

    Component
    Description

    • Columnar storage engine

    • Highly available

    • Optimized for Online Analytical Processing (OLAP) workloads

    • Scalable query execution

    MariaDB MaxScale Components

    Component
    Description

    Listener

    Listens for client connections to MaxScale then passes them to the router service

    MariaDB Monitor

    Tracks changes in the state of MariaDB Enterprise Servers.

    Read Connection Router

    Routes connections from the listener to any available Enterprise ColumnStore node

    Read/Write Split Router

    Routes read operations from the listener to any available Enterprise ColumnStore node, and routes write operations from the listener to a specific server that MaxScale uses as the primary server

    Server Module

    Connection configuration in MaxScale to an Enterprise ColumnStore node

    Topology

    The MariaDB Enterprise ColumnStore topology with Object Storage delivers production analytics with high availability, fault tolerance, and limitless data storage by leveraging S3-compatible storage.

    The topology consists of:

    • One or more MaxScale nodes

    • An odd number of ColumnStore nodes (minimum of 3) running ES, Enterprise ColumnStore, and CMAPI

    The MaxScale nodes:

    • Monitor the health and availability of each ColumnStore node using the MariaDB Monitor (mariadbmon)

    • Accept client and application connections

    • Route queries to ColumnStore nodes using the Read/Write Split Router (readwritesplit)

    The ColumnStore nodes:

    • Receive queries from MaxScale

    • Execute queries

    • Use S3-compatible object storage for data

    • Use shared local storage for the Storage Manager directory

    Requirements

    These requirements are for the ColumnStore Object Storage topology when deployed with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5.

    • Node Count

    • Operating System

    • Minimum Hardware Requirements

    • Recommended Hardware Requirements

    • Storage Requirements

    • S3-Compatible Object Storage Requirements

    • Preferred Object Storage Providers: Cloud

    • Preferred Object Storage Providers: Hardware

    • Shared Local Storage Directories

    • Shared Local Storage Options

    Node Count

    • MaxScale nodes, 1 or more are required.

    • Enterprise ColumnStore nodes, 3 or more are required for high availability. You should always have an odd number of nodes in a multi-node ColumnStore deployment to avoid split brain scenarios.

    Operating System

    In alignment to the , the ColumnStore Object Storage topology with MariaDB Enterprise Server 10.5, MariaDB Enterprise ColumnStore 5, and MariaDB MaxScale 2.5 is provided for:

    • CentOS Linux 7 (x86_64)

    • Debian 10 (x86_64)

    • Red Hat Enterprise Linux 7 (x86_64)

    • Red Hat Enterprise Linux 8 (x86_64)

    • Ubuntu 18.04 LTS (x86_64)

    • Ubuntu 20.04 LTS (x86_64)

    Minimum Hardware Requirements

    MariaDB Enterprise ColumnStore's minimum hardware requirements are not intended for production environments, but the minimum hardware requirements can be appropriate for development and test environments. For production environments, see the recommended hardware requirements instead.

    The minimum hardware requirements are:

    Component
    CPU
    Memory

    MaxScale node

    4+ cores

    4+ GB

    Enterprise ColumnStore node

    4+ cores

    4+ GB

    MariaDB Enterprise ColumnStore will refuse to start if the system has less than 3 GB of memory.

    If Enterprise ColumnStore is started on a system with less memory, the following error message will be written to the ColumnStore system log called crit.log:

    And the following error message will be raised to the client:

    Recommended Hardware Requirements

    MariaDB Enterprise ColumnStore's recommended hardware requirements are intended for production analytics.

    The recommended hardware requirements are:

    Component
    CPU
    Memory

    MaxScale node

    8+ cores

    16+ GB

    Enterprise ColumnStore node

    64+ cores

    128+ GB

    Storage Requirements

    The ColumnStore Object Storage topology requires the following storage types:

    Storage Type
    Description

    The ColumnStore Object Storage topology uses S3-compatible object storage to store data.

    The ColumnStore Object Storage topology uses shared local storage for the Storage Manager directory to store metadata.

    S3-Compatible Object Storage Requirements

    The ColumnStore Object Storage topology uses S3-compatible object storage to store data.

    Many S3-compatible object storage services exist. MariaDB Corporation cannot make guarantees about all S3-compatible object storage services, because different services provide different functionality.

    For the preferred S3-compatible object storage providers that provide cloud and hardware solutions, see the following sections:

    • Cloud

    • Hardware

    The use of non-cloud and non-hardware providers is at your own risk.

    If you have any questions about using specific S3-compatible object storage with MariaDB Enterprise ColumnStore, contact us.

    Preferred Object Storage Providers: Cloud

    • Amazon Web Services (AWS) S3

    • Google Cloud Storage

    • Azure Storage

    • Alibaba Cloud Object Storage Service

    Preferred Object Storage Providers: Hardware

    • Cloudian HyperStore

    • Cohesity S3

    • Dell EMC

    • IBM Cloud Object Storage

    • Seagate Lyve Rack

    • Quantum ActiveScale

    Shared Local Storage Directories

    The ColumnStore Object Storage topology uses shared local storage for the to store metadata.

    The Storage Manager directory is located at the following path by default:

    • /var/lib/columnstore/storagemanager

    Shared Local Storage Options

    The most common shared local storage options for the ColumnStore Object Storage topology are:

    Shared Local Storage
    Common Usage
    Description

    EBS (Elastic Block Store) Multi-Attach

    AWS

    • EBS is a high-performance block-storage service for AWS (Amazon Web Services).

    • EBS Multi-Attach allows an EBS volume to be attached to multiple instances in AWS. Only clustered file systems, such as GFS2, are supported.

    • For deployments in AWS, EBS Multi-Attach is a recommended option for the Storage Manager directory, and Amazon S3 storage is the recommended option for data.

    EFS (Elastic File System)

    AWS

    • EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services).

    • For deployments in AWS, EFS is a recommended option for the Storage Manager directory, and Amazon S3 storage is the recommended option for data. EFS is a scalable, elastic, cloud-native NFS file system for AWS (Amazon Web Services).

    Filestore

    GCP

    • Filestore is high-performance, fully managed storage for GCP (Google Cloud Platform).

    • For deployments in GCP, Filestore is the recommended option for the Storage Manager directory, and Google Object Storage (S3-compatible) is the recommended option for data.

    GlusterFS

    On-premises

    Recommended Storage Options

    For best results, MariaDB Corporation would recommend the following storage options:

    Environment
    Object Storage For Data
    Shared Local Storage For Storage Manager

    AWS

    Amazon S3 storage

    EBS Multi-Attach or EFS

    GCP

    Google Object Storage (S3-compatible)

    Filestore

    On-premises

    Any S3-compatible object storage

    NFS

    Enterprise ColumnStore Management with CMAPI

    Enterprise ColumnStore's CMAPI (Cluster Management API) is a REST API that can be used to manage a multi-node Enterprise ColumnStore cluster.

    Many tools are capable of interacting with REST APIs. For example, the curl utility could be used to make REST API calls from the command-line.

    Many programming languages also have libraries for interacting with REST APIs.

    The examples below show how to use the CMAPI with curl.

    URL Endpoint Format for REST API

    For example:

    • https://mcs1:8640/cmapi/0.4.0/cluster/shutdown

    • https://mcs1:8640/cmapi/0.4.0/cluster/start

    • https://mcs1:8640/cmapi/0.4.0/cluster/status

    With CMAPI 1.4 and later:

    • https://mcs1:8640/cmapi/0.4.0/cluster/node

    With CMAPI 1.3 and earlier:

    • https://mcs1:8640/cmapi/0.4.0/cluster/add-node

    • https://mcs1:8640/cmapi/0.4.0/cluster/remove-node

    Required Request Headers

    • 'x-api-key': '93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd'

    • 'Content-Type': 'application/json'

    x-api-key can be set to any value of your choice during the first call to the server. Subsequent connections will require this same key.

    Get Status

    curl examples remain valid but are now considered legacy.

    $ mcs cluster status

    Start Cluster

    $ mcs cluster start --timeout 20

    Stop Cluster

    $ mcs cluster shutdown --timeout 20

    Add Node

    • With CMAPI 1.4 and later:

    • With CMAPI 1.3 and earlier:

    Remove Node

    • With CMAPI 1.4 and later:

    • With CMAPI 1.3 and earlier:

    Quick Reference

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set system-variables and options. The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set system-variables and options.

    SQL

    Users can set system-variables that support dynamic changes on-the-fly using the SET statement.

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path

    Distribution

    Example Configuration File Path

    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service.

    Operation
    Command

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    For additional information, see "Starting and Stopping MariaDB".

    MariaDB Enterprise Server Logs

    MariaDB Enterprise Server produces log data that can be helpful in problem diagnosis.

    Log filenames and locations may be overridden in the server configuration. The default location of logs is the data directory. The data directory is specified by the datadir system variable.

    Log
    System Variable/Option
    Default Filename

    <hostname>.err

    server_audit.log

    <hostname>-slow.log

    Enterprise ColumnStore Service Management

    The systemctl command is used to start and stop the ColumnStore service.

    Operation
    Command

    Start

    sudo systemctl start mariadb-columnstore

    Stop

    sudo systemctl stop mariadb-columnstore

    Restart

    sudo systemctl restart mariadb-columnstore

    Enable during startup

    sudo systemctl enable mariadb-columnstore

    Disable during startup

    sudo systemctl disable mariadb-columnstore

    Status

    sudo systemctl status mariadb-columnstore

    In the ColumnStore Object Storage topology, the mariadb-columnstore service should not be enabled. The CMAPI service restarts Enterprise ColumnStore as needed, so it does not need to start automatically upon reboot.

    Enterprise ColumnStore CMAPI Service Management

    The systemctl command is used to start and stop the CMAPI service.

    Operation
    Command

    Start

    sudo systemctl start mariadb-columnstore-cmapi

    Stop

    sudo systemctl stop mariadb-columnstore-cmapi

    Restart

    sudo systemctl restart mariadb-columnstore-cmapi

    Enable during startup

    sudo systemctl enable mariadb-columnstore-cmapi

    Disable during startup

    sudo systemctl disable mariadb-columnstore-cmapi

    Status

    sudo systemctl status mariadb-columnstore-cmapi

    For additional information on endpoints, see "CMAPI".

    MaxScale Configuration Management

    MaxScale can be configured using several methods. These methods make use of MaxScale's REST API.

    Method
    Benefits

    Command-line utility to perform administrative tasks through the REST API. See MaxCtrl Commands.

    MaxGUI is a graphical utility that can perform administrative tasks through the REST API.

    The REST API can be used directly. For example, the curl utility could be used to make REST API calls from the command-line. Many programming languages also have libraries to interact with REST APIs.

    The procedure on these pages configures MaxScale using MaxCtrl.

    MaxScale Service Management

    The systemctl command is used to start and stop the MaxScale service.

    Operation
    Command

    Start

    sudo systemctl start maxscale

    Stop

    sudo systemctl stop maxscale

    Restart

    sudo systemctl restart maxscale

    Enable during startup

    sudo systemctl enable maxscale

    Disable during startup

    sudo systemctl disable maxscale

    Status

    sudo systemctl status maxscale

    For additional information, see "Starting and Stopping MariaDB".

    Next Step

    Navigation in the procedure "Deploy ColumnStore Object Storage Topology":

    Next: Step 1: Prepare ColumnStore Nodes.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    Columnar storage engine with S3-compatible object storage

    • Highly available

    • Automatic failover via MaxScale and CMAPI

    • Scales reads via MaxScale

    • Bulk data import

    • Enterprise Server 10.5, Enterprise ColumnStore 5, MaxScale 2.5

    • Enterprise Server 10.6, Enterprise ColumnStore 23.02, MaxScale 22.08

    MariaDB Database Products

    These instructions detail the deployment of the following MariaDB database products:

    Component
    Description

    MariaDB Enterprise Server

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    MariaDB Enterprise Server Components

    These instructions detail the deployment of the following MariaDB Enterprise Server components:

    Component
    Description

    InnoDB

    • It is a general purpose storage engine

    • It is ACID-compliant

    • It is performant

    • It is the transactional component of MariaDB's single stack solution

    Term Definitions

    Term
    Definition

    row database

    • A database where all columns of each row are stored together

    • Best suited for transactional and OLTP workloads

    • Also known as a "row-oriented database"

    Installation

    MariaDB Corporation provides package repositories for YUM (RHEL, CentOS), APT (Debian, Ubuntu), and ZYpp (SLES).

    Install via YUM (CentOS, RHEL, Rocky)

    1. Retrieve your Customer Download Token at https://customers.mariadb.com/downloads/token/ and substitute for CUSTOMER_DOWNLOAD_TOKEN in the following directions.

    2. Configure the YUM package repository.

    Pass the version to install using the --mariadb-server-version flag to mariadb_es_repo_setup. The following directions reference 11.4. To configure YUM package repositories:

    1. Checksums of the various releases of the mariadb_es_repo_setup script can be found in the Versions section at the bottom of the MariaDB Package Repository Setup and Usage page. Substitute ${checksum} in the example above with the latest checksum.

    2. Install MariaDB Enterprise Server and package dependencies:

    1. Configure MariaDB.

    Installation only loads MariaDB Enterprise Server to the system. MariaDB Enterprise Server requires configuration before the database server is ready for use. See Configuration.

    Install via APT (Debian, Ubuntu)

    1. Retrieve your Customer Download Token at https://customers.mariadb.com/downloads/token/ and substitute for CUSTOMER_DOWNLOAD_TOKEN in the following directions.

    2. Configure the APT package repository.

    Pass the version to install using the --mariadb-server-version flag to mariadb_es_repo_setup. The following directions reference

    To configure APT package repositories:

    1. Checksums of the various releases of the mariadb_es_repo_setup script can be found in the Versions section at the bottom of the MariaDB Package Repository Setup and Usage page. Substitute ${checksum} in the example above with the latest checksum.

    2. Install MariaDB Enterprise Server and package dependencies:

    1. Configure MariaDB.

    Installation only loads MariaDB Enterprise Server to the system. MariaDB Enterprise Server requires configuration before the database server is ready for use. See Configuration.

    Install via ZYpp (SLES)

    1. Retrieve your Customer Download Token at https://customers.mariadb.com/downloads/token/ and substitute for CUSTOMER_DOWNLOAD_TOKEN in the following directions.

    2. Configure the ZYpp package repository.

    Pass the version to install using the --mariadb-server-version flag to mariadb_es_repo_setup. The following directions reference 11.4.

    To configure ZYpp package repositories:

    1. Checksums of the various releases of the mariadb_es_repo_setup script can be found in the Versions section at the bottom of the MariaDB Package Repository Setup and Usage page. Substitute ${checksum} in the example above with the latest checksum.

    2. Install MariaDB Enterprise Server and package dependencies:

    1. Configure MariaDB.

    Installation only loads MariaDB Enterprise Server to the system. MariaDB Enterprise Server requires configuration before the database server is ready for use. See Configuration.

    Configuration

    MariaDB Enterprise Server can be configured in the following ways:

    • System variables and options can be set in a configuration file (such as /etc/my.cnf). MariaDB Enterprise Server must be restarted to apply changes made to the configuration file.

    • System variables and options can be set on the command-line.

    • If a system variable supports dynamic changes, then it can be set on-the-fly using the SET statement.

    Configuration Files

    MariaDB's packages include several bundled configuration files. It is also possible to create custom configuration files.

    On RHEL, CentOS, and SLES, MariaDB's packages bundle the following configuration files:

    • /etc/my.cnf

    • /etc/my.cnf.d/client.cnf

    • /etc/my.cnf.d/mariadb-enterprise.cnf

    • /etc/my.cnf.d/mysql-clients.cnf

    • /etc/my.cnf.d/server.cnf

    And on RHEL, CentOS, and SLES, custom configuration files from the following directories are read by default:

    • /etc/my.cnf.d/

    On Debian and Ubuntu, MariaDB's packages bundle the following configuration files:

    • /etc/mysql/my.cnf

    • /etc/mysql/mariadb.cnf

    • /etc/mysql/mariadb.conf.d/50-client.cnf

    • /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf

    • /etc/mysql/mariadb.conf.d/50-mysqld_safe.cnf

    • /etc/mysql/mariadb.conf.d/50-server.cnf

    • /etc/mysql/mariadb.conf.d/60-galera.cnf

    • /etc/mysql/mariadb.conf.d/mariadb-enterprise.cnf

    And on Debian and Ubuntu, custom configuration files from the following directories are read by default:

    • /etc/mysql/conf.d/

    • /etc/mysql/mariadb.conf.d/

    Configure MariaDB

    Determine which system variables and options you need to configure.

    Useful system variables and options for MariaDB Enterprise Server include:

    System Variable/Option
    Description

    Sets the path to the data directory. MariaDB Enterprise Server writes data files to this directory, including tablespaces, logs, and schemas. Change it to use a non-standard location or to start the Server on a different data directory for testing.

    Sets the local TCP/IP address on which MariaDB Enterprise Server listens for incoming connections. When testing on a local system, bind the address to the local host at 127.0.0.1 to prevent network access.

    Sets the port MariaDB Enterprise Server listens on. Use this system variable to use a non-standard port or when running multiple Servers on the same host for testing.

    Sets the maximum number of simultaneous connections MariaDB Enterprise Server allows.

    Sets how MariaDB Enterprise Server handles threads for client connections.

    Sets the file name for the error log.

    1. Choose a configuration file in which to configure your system variables and options.

    It is not recommended to make custom changes to one of the bundled configuration files. Instead, it is recommended to create a custom configuration file in one of the included directories. Configuration files in included directories are read in alphabetical order. If you want your custom configuration file to override the bundled configuration files, then it is a good idea to prefix the custom configuration file's name with a string that will be sorted last, such as z-.

    • On RHEL, CentOS, and SLES, a good custom configuration file would be: /etc/my.cnf.d/z-custom-my.cnf

    • On Debian and Ubuntu, a good custom configuration file would be: /etc/mysql/mariadb.conf.d/z-custom-my.cnf

    1. Set your system variables and options in the configuration file.

    They need to be set in a group that will be read by mariadbd, such as [mariadb] or [server].

    For example:

    Start the Server

    MariaDB Enterprise Server includes configuration to start, stop, restart, enable/disable on boot, and check the status of the Server using the operating system default process management system.

    For distributions that use systemd (most supported OSes), you can manage the Server process using the systemctl command:

    Operation
    Command

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    Test MariaDB Enterprise Server

    When MariaDB Enterprise Server is up and running on your system, you should test that it is working and there weren't any issues during startup.

    1. Connect to the server using mariadb Client using the root@localhost user account:

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    This procedure describes the deployment of the Primary/Replica topology with MariaDB Enterprise Server and MariaDB MaxScale.

    Primary/Replica topology provides read scalability and fault tolerance through asynchronous or semi-synchronous single-primary replication.

    This procedure has 7 steps, which are executed in sequence.

    MariaDB products can be deployed in many different topologies to suit specific use cases. The Primary/Replica topology can be deployed on its own or integrated with MariaDB Enterprise Cluster.

    This procedure represents basic product capability with 3 Enterprise Server nodes and 1 MaxScale node.

    This page provides an overview of the topology, requirements, and deployment procedure.

    Please read and understand this procedure before executing.

    Procedure Steps

    Step
    Description

    Install MariaDB Enterprise Server

    Start and Configure MariaDB Enterprise Server on Primary Server

    Start and Configure MariaDB Enterprise Server on Replica Servers

    Test MariaDB Enterprise Server

    Install MariaDB MaxScale

    Start and Configure MariaDB MaxScale

    Components

    The following components are deployed during this procedure:

    Component
    Function

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    Database proxy that extends the availability, scalability, and security of MariaDB Enterprise Servers

    MariaDB Enterprise Server Components

    Component
    Description

    • General purpose storage engine

    • ACID-compliant

    • Performance

    MariaDB MaxScale Components

    Component
    Description

    Listener

    Listens for client connections to MaxScale, then passes them to the router service associated with the listener

    MariaDB Monitor

    Tracks changes in the state of MariaDB Enterprise Servers.

    Read Connection Router

    Routes connections from the listener to any available Enterprise Server node

    Read/Write Split Router

    Routes read operations from the listener to any available Enterprise Server node, and routes write operations from the listener to a specific server operating as the primary server

    Server Module

    Connection configuration in MaxScale to an Enterprise Server node

    Topology

    Primary/Replica topology provides read scalability and fault tolerance through asynchronous or semi-synchronous single-primary replication of MariaDB Enterprise Server 11.4

    The Primary/Replica topology consists of:

    • 1 or more MaxScale nodes

    • 1 Enterprise Server node operating as the primary server

    • 2 or more Enterprise Server nodes operating as replica servers.

    The MaxScale nodes:

    • Monitor the health and availability of the Enterprise Server nodes

    • Route queries to Enterprise Server nodes using Read/Write Split (readwritesplit) and Read Connection (readconnroute) routers.

    • Promote replica servers in the event that the primary server fails.

    The Enterprise Server node is operating as the primary server:

    • Receives write queries from MaxScale, logging them to the Binary Log

    • Provides Binary Logs to replica servers for replication

    The Enterprise Server nodes are operating as replica servers:

    • Receive read queries from MaxScale

    • Replicate writes asynchronously or semi-synchronously from the primary server

    Requirements

    These requirements are for the Primary/Replica topology when deployed with MariaDB Enterprise Server 11.4 and MariaDB MaxScale 25.01.

    • Operating System

    • System User Accounts

    Operating System

    In alignment to the , the Primary/Replica topology with MariaDB Enterprise Server 11.4 and MariaDB MaxScale 25.01 is provided for:

    • AlmaLinux 8 (x86_64, ARM64)

    • AlmaLinux 9 (x86_64, ARM64)

    • Debian 11 (x86_64, ARM64)

    • Debian 12 (x86_64, ARM64)

    • Microsoft Windows (x86_64)

    • Red Hat Enterprise Linux 8 (x86_64, ARM64)

    • Red Hat Enterprise Linux 9 (x86_64, PPC64LE, ARM64)

    • Red Hat UBI 8 (x86_64, ARM64)

    • Rocky Linux 8 (x86_64, ARM64)

    • Rocky Linux 9 (x86_64, ARM64)

    • SUSE Linux Enterprise Server 15 (x86_64, ARM64)

    • Ubuntu 20.04 LTS (x86_64, ARM64)

    • Ubuntu 22.04 LTS (x86_64, ARM64)

    • Ubuntu 24.04 LTS (x86_64, ARM64)

    System User Accounts

    User Account
    Purpose

    maxscale

    MaxScale process owner

    mysql

    Enterprise Server process owner

    Quick Reference

    • MariaDB Enterprise Server Configuration Management

    • MariaDB Enterprise Server Service Management

    • MariaDB Enterprise Server Logs

    • MaxScale Configuration Management

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set system-variables and options. The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set system-variables and options.

    SQL

    Users can set system-variables that support dynamic changes on-the-fly using the SET statement.

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path
    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    • SUSE Linux Enterprise Server (SLES)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/mysql/mariadb.conf.d/z-custom-mariadb.cnf

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service.

    Operation
    Command

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    For additional information, see "Starting and Stopping MariaDB".

    MariaDB Enterprise Server Logs

    MariaDB Enterprise Server produces log data that can be helpful in problem diagnosis.

    Log filenames and locations may be overridden in the server configuration. The default location of logs is the data directory. The data directory is specified by the datadir system variable.

    Log
    System Variable/Option
    Default Filename

    <hostname>.err

    server_audit.log

    <hostname>-slow.log

    MaxScale Configuration Management

    MaxScale can be configured using several methods. These methods make use of MaxScale's .

    Method
    Benefits

    Command-line utility to perform administrative tasks through the REST API. See MaxCtrl Commands.

    MaxGUI is a graphical utility that can perform administrative tasks through the REST API.

    The REST API can be used directly. For example, the curl utility could be used to make REST API calls from the command-line. Many programming languages also have libraries to interact with REST APIs.

    The procedure on these pages configures MaxScale using MaxCtrl.

    MaxScale Service Management

    The systemctl command is used to start and stop the MaxScale service.

    Operation
    Command

    Start

    sudo systemctl start maxscale

    Stop

    sudo systemctl stop maxscale

    Restart

    sudo systemctl restart maxscale

    Enable during startup

    sudo systemctl enable maxscale

    Disable during startup

    sudo systemctl disable maxscale

    Status

    sudo systemctl status maxscale

    For additional information, see "Starting and Stopping MariaDB".

    Next Step

    Navigation in the procedure "Deploy Primary/Replica Topology":

    • Next: Step 1: Install MariaDB Enterprise Server

    This page is: Copyright © 2025 MariaDB. All rights reserved.\

    • Enterprise Server 10.4

    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    MariaDB Replication

    • Highly available

    • Asynchronous or semi-synchronous replication

    • Automatic failover via MaxScale

    • Manual provisioning of new nodes from backup

    log_slave_updates
    relay_log
    relay_log_index
    server_id
    log_slave_updates
    relay_log
    relay_log_index
    server_id
    Step 7
    Step 8
    Step 9
    Binary Log
    log_bin

    HTAP

    Overview

    Software Version
    Diagram
    Features
    • Enterprise Server 10.5

    • Enterprise Server 10.6

    • Enterprise Server 11.4

    Single-stack hybrid transactional/analytical workloads

    • ColumnStore for analytics with scalable S3-compatible object storage

    • InnoDB for transactions

    • Cross-engine JOINs

    • Enterprise Server 10.5, Enterprise ColumnStore 5, MaxScale 2.5

    This procedure describes the deployment of the HTAP topology with MariaDB Enterprise Server and MariaDB Enterprise ColumnStore.

    MariaDB Enterprise ColumnStore is a columnar storage engine for MariaDB Enterprise Server. This topology is best suited for Hybrid Transactional-Analytical Processing (HTAP) workloads.

    This procedure has 4 steps, which are executed in sequence.

    This procedure represents the basic product capability and uses 1 Enterprise ColumnStore node.

    This page provides an overview of the topology, requirements, and deployment procedures.

    Please read and understand this procedure before executing.

    Procedure Steps

    Step
    Description

    Support

    Customers can obtain support by

    Components

    The following components are deployed during this procedure:

    Component
    Function

    MariaDB Enterprise Server Components

    Component
    Description

    Topology

    The MariaDB Enterprise ColumnStore HTAP topology is designed for hybrid transactional-analytical processing (HTAP) workloads.

    The topology consists of:

    • One MaxScale node

    • One ColumnStore node running ES and Enterprise ColumnStore

    The MaxScale node:

    • Monitors the health and availability of the ColumnStore node using the MariaDB Monitor (mariadbmon)

    • Accepts client and application connections

    • Routes queries to the ColumnStore node using the Read/Write Split Router (readwritesplit)

    The ColumnStore node:

    • Receives queries from MaxScale

    • Executes queries

    • Uses a row-based storage engine, such as to handle transactional queries

    • Uses Enterprise ColumnStore as the columnar storage engine to handle analytical queries

    Requirements

    These requirements are for the HTAP topology when deployed with MariaDB Enterprise Server 11.4 and MariaDB Enterprise ColumnStore.

    Operating System

    In alignment to the , the HTAP topology with MariaDB Enterprise Server 11.4 and MariaDB Enterprise ColumnStore is provided for:

    • Debian 11 (x86_64, ARM64)

    • Debian 12 (x86_64, ARM64)

    • Red Hat Enterprise Linux 8 (x86_64, ARM64)

    • Red Hat Enterprise Linux 9 (x86_64, ARM64)

    S3-Compatible Object Storage Option

    The HTAP topology can use S3-compatible object storage to store ColumnStore data, but it is not required.

    Many S3-compatible object storage services exist. MariaDB Corporation cannot make guarantees about all S3-compatible object storage services, because different services provide different functionality.

    For the preferred S3-compatible object storage providers that provide cloud and hardware solutions, see the following sections:

    The use of non-cloud and non-hardware providers is at your own risk.

    If you have any questions about using specific S3-compatible object storage with MariaDB Enterprise ColumnStore, .

    Preferred Object Storage Providers: Cloud

    • Amazon Web Services (AWS) S3

    • Google Cloud Storage

    • Azure Storage

    • Alibaba Cloud Object Storage Service

    Preferred Object Storage Providers: Hardware

    • Cloudian HyperStore

    • Dell EMC

    • Seagate Lyve Rack

    • Quantum ActiveScale

    Limitations

    Cross-Database Queries

    This implementation relies on replicate_rewrite_db, so it does not support cross-database queries with statement-based replication.

    For example, if the replicated database is selected by the USE, then the query will replicate properly:

    However, if the replicated database is not selected, and it is instead prefixed the table name in the query, then the query will not replicate properly:

    Semi-Synchronous Replication

    This implementation has not been tested with semi-synchronous replication.

    Parallel Replication

    This implementation has not been tested with parallel replication.

    Row-Based Replication

    This implementation requires the system variable to be set to STATEMENT. Row-based replication is not currently supported.

    Quick Reference

    MariaDB Enterprise Server Configuration Management

    Method
    Description

    MariaDB Enterprise Server packages are configured to read configuration files from different paths, depending on the operating system. Making custom changes to Enterprise Server default configuration files is not recommended because custom changes may be overwritten by other default configuration files that are loaded later.

    To ensure that your custom changes will be read last, create a custom configuration file with the z- prefix in one of the include directories.

    Distribution
    Example Configuration File Path

    MariaDB Enterprise Server Service Management

    The systemctl command is used to start and stop the MariaDB Enterprise Server service.

    Operation
    Command

    For additional information, see "".

    MariaDB Enterprise Server Logs

    MariaDB Enterprise Server produces log data that can be helpful in problem diagnosis.

    Log filenames and locations may be overridden in the server configuration. The default location of logs is the data directory. The data directory is specified by the datadir system variable.

    Log
    System Variable/Option
    Default Filename

    Enterprise ColumnStore Service Management

    The systemctl command is used to start and stop the ColumnStore service.

    Operation
    Command

    Next Step

    Navigation in the procedure "Deploy HTAP Topology".

    Next: Step 1: Prepare ColumnStore Node.

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    $ sudo yum install MariaDB-server MariaDB-backup
    $ sudo apt install mariadb-server mariadb-backup
    $ sudo zypper install MariaDB-server MariaDB-backup
    [mariadb]
    log_error                 = mariadb-test.err
    innodb_buffer_pool_size   = 1G
    $ sudo yum install curl
    $ curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup
    $ echo "${checksum} mariadb_repo_setup" \
        | sha256sum -c -
    $ chmod +x mariadb_repo_setup
    $ sudo ./mariadb_repo_setup \
       --mariadb-server-version="mariadb-11.4"
    $ sudo apt install curl
    $ curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup
    $ echo "${checksum} mariadb_repo_setup" \
        | sha256sum -c -
    $ chmod +x mariadb_repo_setup
    $ sudo ./mariadb_repo_setup \
       --mariadb-server-version="mariadb-11.4"
    $ sudo apt update
    $ sudo zypper install curl
    $ curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup
    $ echo "${checksum} mariadb_repo_setup" \
        | sha256sum -c -
    $ chmod +x mariadb_repo_setup
    $ sudo ./mariadb_repo_setup \
       --mariadb-server-version="mariadb-11.4"
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 10.5.28-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    Apr 30 21:54:35 a1ebc96a2519 PrimProc[1004]: 35.668435 |0|0|0| C 28 CAL0000: Error total memory available is less than 3GB.
    ERROR 1815 (HY000): Internal error: System is not ready yet. Please try again.
    https://{server}:{port}/cmapi/{version}/{route}/{command}
    $ curl -k -s https://mcs1:8640/cmapi/0.4.0/cluster/status \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/start \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/shutdown \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/add-node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ curl -k -s -X DELETE https://mcs1:8640/cmapi/0.4.0/cluster/node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ curl -k -s -X PUT https://mcs1:8640/cmapi/0.4.0/cluster/remove-node \
          --header 'Content-Type:application/json' \
          --header 'x-api-key:93816fa66cc2d8c224e62275bd4f248234dd4947b68d4af2b29671dd7d5532dd' \
          --data '{"timeout":20, "node": "192.0.2.2"}' \
          | jq .
    $ sudo yum install curl
    
    $ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
    
    $ echo "${checksum}  mariadb_es_repo_setup" \
        | sha256sum -c -
    
    $ chmod +x mariadb_es_repo_setup
    
    $ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
       --mariadb-server-version="11.4"
    $ sudo yum install MariaDB-server MariaDB-backup
    $ sudo apt install curl
    
    $ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
    
    $ echo "${checksum}  mariadb_es_repo_setup" \
        | sha256sum -c -
    
    $ chmod +x mariadb_es_repo_setup
    
    $ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
       --mariadb-server-version="11.4"
    
    $ sudo apt update
    $ sudo apt install mariadb-server mariadb-backup
    $ sudo zypper install curl
    
    $ curl -LsSO https://dlm.mariadb.com/enterprise-release-helpers/mariadb_es_repo_setup
    
    $ echo "${checksum}  mariadb_es_repo_setup" \
        | sha256sum -c -
    
    $ chmod +x mariadb_es_repo_setup
    
    $ sudo ./mariadb_es_repo_setup --token="CUSTOMER_DOWNLOAD_TOKEN" --apply \
       --mariadb-server-version="11.4"
    $ sudo zypper install MariaDB-server MariaDB-backup
    [mariadb]
    log_error                 = mariadbd.err
    innodb_buffer_pool_size   = 1G
    $ sudo mariadb
    
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 11.4.5-3-MariaDB-Enterprise MariaDB Enterprise Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    max_connections
    thread_handling
    log_error
    innodb_buffer_pool_size
    innodb_log_file_size
    innodb_log_files_in_group
    innodb_io_capacity

    innodb_buffer_pool_size

    Sets the amount of memory InnoDB reserves for the Buffer Pool.

    innodb_log_file_size

    Sets the size for each Redo Log file and innodb_log_files_in_group sets the number of Redo Log files used by InnoDB.

    innodb_io_capacity

    Sets the maximum number of I/O operations per second that InnoDB can use.

    Hybrid Transactional/Analytical Processing (HTAP)
    datadir
    bind_address
    port
    max_connections
    thread_handling
    log_error

    Uses cross-engine JOINs to join transactional and analytical tables

  • Replicates data between engines using MariaDB Replication

  • Optionally uses S3-compatible object storage for Enterprise ColumnStore data

  • Rocky Linux 8 (x86_64, ARM64)
  • Rocky Linux 9 (x86_64, ARM64)

  • Ubuntu 20.04 LTS (x86_64, ARM64)

  • Ubuntu 22.04 LTS (x86_64, ARM64)

  • Ubuntu 24.04 LTS (x86_64, ARM64)

  • IBM Cloud Object Storage

    <hostname>-bin

    Enterprise Server 10.6, Enterprise ColumnStore 23.02, MaxScale 22.08

    Step 1

    Prepare ColumnStore Node

    Step 2

    Install MariaDB Enterprise Server

    Step 3

    Start and Configure MariaDB Enterprise Server

    Step 4

    Test MariaDB Enterprise Server

    MariaDB Enterprise Server

    Modern SQL RDBMS with high availability, pluggable storage engines, hot online backups, and audit logging.

    InnoDB

    • General purpose storage engine

    • Support for Online Transactional Processing (OLTP) workloads

    • ACID-compliant

    • Performance

    MariaDB Enterprise ColumnStore

    • Columnar storage engine

    • Optimized for Online Analytical

    • Processing (OLAP) workloads

    • Scalable query execution

    Configuration File

    Configuration files (such as /etc/my.cnf) can be used to set system-variables and options. The server must be restarted to apply changes made to configuration files.

    Command-line

    The server can be started with command-line options that set system-variables and options.

    SQL

    Users can set system-variables that support dynamic changes on-the-fly using the SET statement.

    • CentOS

    • Red Hat Enterprise Linux (RHEL)

    /etc/my.cnf.d/z-custom-mariadb.cnf

    • Debian

    • Ubuntu

    /etc/my.cnf.d/z-custom-mariadb.cnf

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    MariaDB Error Log

    log_error

    <hostname>.err

    MariaDB Enterprise Audit Log

    server_audit_file_path

    server_audit.log

    Slow Query Log

    slow_query_log_file

    <hostname>-slow.log

    General Query Log

    general_log_file

    Start

    sudo systemctl start mariadb-columnstore

    Stop

    sudo systemctl stop mariadb-columnstore

    Restart

    sudo systemctl restart mariadb-columnstore

    Enable during startup

    sudo systemctl enable mariadb-columnstore

    Disable during startup

    sudo systemctl disable mariadb-columnstore

    Status

    sudo systemctl status mariadb-columnstore

    submitting a support case.
    InnoDB
    Operating System
    S3-Compatible Object Storage Option
    Preferred Object Storage Providers: Cloud
    Preferred Object Storage Providers: Hardware
    Cloud
    Hardware
    contact us
    binlog_format
    Starting and Stopping MariaDB

    <hostname>.log

    provides a REST API for multi-node administration

    Step 7

    Start and Configure MariaDB MaxScale

    Step 8

    Test MariaDB MaxScale

    Step 9

    Import Data

    • GlusterFS is a distributed file system.

    • GlusterFS supports replication and failover.

    NFS (Network File System)

    On-premises

    • NFS is a distributed file system.

    • If NFS is used, the storage should be mounted with the sync option to ensure that each node flushes its changes immediately.

    • For on-premises deployments, NFS is the recommended option for the Storage Manager directory, and any S3-compatible storage is the recommended option for data.

    <hostname>.log

    Binary Log

    log_bin

    <hostname>-bin

    Step 1
    Step 2
    Step 3
    Step 4
    Step 5
    Step 6
    MariaDB Enterprise Server
    MariaDB Enterprise ColumnStore
    S3-Compatible Object Storage
    Shared Local Storage
    MariaDB Error Log
    log_error
    MariaDB Enterprise Audit Log
    server_audit_file_path
    Slow Query Log
    slow_query_log_file
    General Query Log
    general_log_file
    MaxCtrl
    MaxGUI
    REST API
    MariaDB MaxScale

    Scales reads via MaxScale

  • Enterprise Server 10.3+, MaxScale 2.5+

  • Step 7

    Test MariaDB MaxScale

    <hostname>.log

    Binary Log

    log_bin

    <hostname>-bin

    MaxScale Service Management
    Step 1
    Step 2
    Step 3
    Step 4
    Step 5
    Step 6
    MariaDB Enterprise Server
    InnoDB
    MariaDB Error Log
    log_error
    MariaDB Enterprise Audit Log
    server_audit_file_path
    Slow Query Log
    slow_query_log_file
    General Query Log
    general_log_file
    MariaDB MaxScale
    USE innodb_db;
    
    INSERT INTO htap_test1
       VALUES (100);
    SELECT * FROM columnstore_db.htap_test1;
    
    +------+
    | id   |
    +------+
    |  100 |
    +------+
    USE columnstore_db;
    
    INSERT INTO innodb_db.htap_test1
       VALUES (200);
    SELECT * FROM columnstore_db.htap_test1;
    
    +------+
    | id   |
    +------+
    |  100 |
    +------+
    Binary Log
    log_bin
    wsrep_cluster_status
    wsrep_cluster_size
    wsrep_cluster_address
    wsrep_provider
    wsrep_cluster_address
    wsrep_cluster_size
    wsrep_cluster_size
    wsrep_local_state_comment
    wsrep_local_state_comment
    wsrep_sst_method
    wsrep_local_state_comment
    wsrep_cluster_address
    wsrep_cluster_name
    wsrep_provider
    wsrep_provider_options

    Step 7: Test MariaDB MaxScale

    Overview

    This page details step 7 of the 7-step procedure "Deploy Primary/Replica Topology".

    This step tests MariaDB MaxScale.

    Interactive commands are detailed. Alternatively, the described operations can be performed using automation.

    Check Global Configuration

    Use command to view the global MaxScale configuration.

    This action is performed on the MaxScale node:

    Output should align to the global MaxScale configuration in the new configuration file you created.

    Check Server Configuration

    Use the and commands to view the configured server objects.

    This action is performed on the MaxScale node:

    1. Obtain the full list of servers objects:

    1. For each server object, view the configuration:

    Output should align to the Server Object configuration you performed.

    Check Monitor Configuration

    Use the and commands to view the configured monitors.

    This action is performed on the MaxScale node:

    1. Obtain the full list of monitors:

    1. For each monitor, view the monitor configuration:

    Output should align to the Galera Monitor (galeramon) configuration you performed.

    Check Service Configuration

    Use the and commands to view the configured routing services.

    This action is performed on the MaxScale node:

    1. Obtain the full list of routing services:

    1. For each service, view the service configuration:

    Output should align to the Read Connection Router (readconnroute) or Read/Write Split Router (readwritesplit) configuration you performed.

    Test Application User

    Applications should use a dedicated user account. The user account must be created on the primary server.

    When users connect to MaxScale, MaxScale authenticates the user connection before routing it to an Enterprise Server node. Enterprise Server authenticates the connection as originating from the IP address of the MaxScale node.

    The application users must have one user account with the host IP address of the application server and a second user account with the host IP address of the MaxScale node.

    The requirement of a duplicate user account can be avoided by enabling the proxy_protocol parameter for MaxScale and the proxy_protocol_networks for Enterprise Server.

    Create a User to Connect from MaxScale

    This action is performed on any Enterprise Cluster node:

    1. Connect to the node:

    1. Create the database user account for your MaxScale node:

    Replace 192.0.2.104 with the relevant IP address specification for your MaxScale node.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the database user account for your MaxScale node:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Create a User to Connect from the Application Server

    This action is performed on any Enterprise Cluster node:

    1. Create the database user account for your application server:

    Replace 192.0.2.11 with the relevant IP address specification for your application server.

    Passwords should meet your organization's password policies.

    1. Grant the privileges required by your application to the database user account for your application server:

    The privileges shown are designed to allow the tests in the subsequent sections to work. The user account for your production application may require different privileges.

    Test Connection with Application User

    To test the connection, use the MariaDB Client from your application server to connect to an Enterprise Cluster node through MaxScale.

    This action is performed on the application server:

    Test Connection with Read Connection Router

    If you configured the Read Connection Router, confirm that MaxScale routes connections to the replica servers.

    1. On the MaxScale node, use the command to view the available listeners and ports:

    1. Open multiple terminals connected to your application server, in each use MariaDB Client to connect to the listener port for the Read Connection Router (in the example 3308):

    Use the application user credentials you created for the --user and --password options.

    1. In each terminal, query the hostname system variable to identify to which you're connected:

    Different terminals should return different values since MaxScale routes the connections to different nodes.

    Since the router was configured the slave router option, the Read Connection Router only routes connections to replica servers.

    Test Write Queries with the Read/Write Split Router

    If you configured the Read/Write Split Router, confirm that readwritesplit correctly routes write queries.

    This action is performed with multiple client connections to the MaxScale node.

    1. On the MaxScale node, use the command to identify the Enterprise Cluster node currently operating as the primary server:

    The server listed as Master is currently operating as the primary server.

    1. On the MaxScale node, use the command to identify the correct listener port:

    In the example, the listener port for the Read/Write Split router is 3307.

    1. Use the MariaDB Client to establish multiple connections to the listener configured for the Read/Write Split routing service, query_router_listener, on the MaxScale node:

    The database user account for your application server should be specified by the --user option.

    1. Using any client connection, create a test table:

    1. Using each client connection, insert the values of the hostname system variable into the table using the INSERT statement to identify the node that executes the statement:

    1. Using any client connection, query the table using the SELECT statement:

    The output shows the hostname from the Enterprise Cluster node operating as the primary server. (Enterprise Cluster offsets auto-increment values by node to avoid write conflicts.)

    Confirm that MaxScale is routing write queries to the Enterprise Cluster node operating as the primary server by checking that the test table only contains the hostname of the correct Enterprise Cluster node.

    Test Read Queries with the Read/Write Split Router

    If you configured the Read/Write Split Router, confirm that readwritesplit properly routes read queries to multiple replica servers.

    This action is performed with multiple clients connected to the MaxScale node.

    1. On the MaxScale node, use to identify the Enterprise Cluster nodes that are currently operating as replica servers:

    The servers listed as Slave are currently operating as replica servers.

    1. On the MaxScale node, use the command to identify the correct listener port:

    In the example, the listener port for the Read/Write Split router is 3307.

    1. Use the MariaDB Client to establish multiple connections to query_router_listener which is the listener configured for the Read/Write Split routing service on the MaxScale node:

    The database user account for your application server should be specified by the --user option.

    1. Using each client connection, query the hostname system variable to identify the node that executes the statement:

    Confirm that MaxScale routes the SELECT statements to different replica servers.

    For more information on different routing criteria, see slave_selection_criteria

    Next Step

    Navigation in the procedure "Deploy Primary/Replica Topology":

    This page was step 7 of 7.

    This procedure is complete.

    maxctrl show maxscale
    maxctrl list servers
    maxctrl show server
    maxctrl list monitors
    maxctrl show monitor
    maxctrl list services
    maxctrl show service
    maxctrl list listeners
    maxctrl list servers
    maxctrl list listeners
    maxctrl list servers
    maxctrl list listeners

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    $ maxctrl show maxscale
    ┌──────────────┬───────────────────────────────────────────────────────┐
    │ Version      │ 25.01.2                                               │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Commit       │ 3761fa7a52046bc58faad8b5a139116f9e33364c              │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Started At   │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Activated At │ Thu, 05 Aug 2021 20:21:20 GMT                         │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Uptime       │ 868                                                   │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Config Sync  │ null                                                  │
    ├──────────────┼───────────────────────────────────────────────────────┤
    │ Parameters   │ {                                                     │
    │              │     "admin_auth": true,                               │
    │              │     "admin_enabled": true,                            │
    │              │     "admin_gui": true,                                │
    │              │     "admin_host": "0.0.0.0",                          │
    │              │     "admin_log_auth_failures": true,                  │
    │              │     "admin_pam_readonly_service": null,               │
    │              │     "admin_pam_readwrite_service": null,              │
    │              │     "admin_port": 8989,                               │
    │              │     "admin_secure_gui": false,                        │
    │              │     "admin_ssl_ca_cert": null,                        │
    │              │     "admin_ssl_cert": null,                           │
    │              │     "admin_ssl_key": null,                            │
    │              │     "admin_ssl_version": "MAX",                       │
    │              │     "auth_connect_timeout": "10000ms",                │
    │              │     "auth_read_timeout": "10000ms",                   │
    │              │     "auth_write_timeout": "10000ms",                  │
    │              │     "cachedir": "/var/cache/maxscale",                │
    │              │     "config_sync_cluster": null,                      │
    │              │     "config_sync_interval": "5000ms",                 │
    │              │     "config_sync_password": "*****",                  │
    │              │     "config_sync_timeout": "10000ms",                 │
    │              │     "config_sync_user": null,                         │
    │              │     "connector_plugindir": "/usr/lib64/mysql/plugin", │
    │              │     "datadir": "/var/lib/maxscale",                   │
    │              │     "debug": null,                                    │
    │              │     "dump_last_statements": "never",                  │
    │              │     "execdir": "/usr/bin",                            │
    │              │     "language": "/var/lib/maxscale",                  │
    │              │     "libdir": "/usr/lib64/maxscale",                  │
    │              │     "load_persisted_configs": true,                   │
    │              │     "local_address": null,                            │
    │              │     "log_debug": false,                               │
    │              │     "log_info": false,                                │
    │              │     "log_notice": true,                               │
    │              │     "log_throttling": {                               │
    │              │         "count": 10,                                  │
    │              │         "suppress": 10000,                            │
    │              │         "window": 1000                                │
    │              │     },                                                │
    │              │     "log_warn_super_user": false,                     │
    │              │     "log_warning": true,                              │
    │              │     "logdir": "/var/log/maxscale",                    │
    │              │     "max_auth_errors_until_block": 10,                │
    │              │     "maxlog": true,                                   │
    │              │     "module_configdir": "/etc/maxscale.modules.d",    │
    │              │     "ms_timestamp": false,                            │
    │              │     "passive": false,                                 │
    │              │     "persistdir": "/var/lib/maxscale/maxscale.cnf.d", │
    │              │     "piddir": "/var/run/maxscale",                    │
    │              │     "query_classifier": "qc_sqlite",                  │
    │              │     "query_classifier_args": null,                    │
    │              │     "query_classifier_cache_size": 289073971,         │
    │              │     "query_retries": 1,                               │
    │              │     "query_retry_timeout": "5000ms",                  │
    │              │     "rebalance_period": "0ms",                        │
    │              │     "rebalance_threshold": 20,                        │
    │              │     "rebalance_window": 10,                           │
    │              │     "retain_last_statements": 0,                      │
    │              │     "session_trace": 0,                               │
    │              │     "skip_permission_checks": false,                  │
    │              │     "sql_mode": "default",                            │
    │              │     "syslog": true,                                   │
    │              │     "threads": 1,                                     │
    │              │     "users_refresh_interval": "0ms",                  │
    │              │     "users_refresh_time": "30000ms",                  │
    │              │     "writeq_high_water": 16777216,                    │
    │              │     "writeq_low_water": 8192                          │
    │              │ }                                                     │
    └──────────────┴───────────────────────────────────────────────────────┘
    $ maxctrl list servers
    ┌────────┬─────────────┬──────┬─────────────┬─────────────────────────┬──────┐
    │ Server │ Address     │ Port │ Connections │ State                   │ GTID │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node1  │ 192.0.2.101 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node2  │ 192.0.2.102 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node3  │ 192.0.2.103 │ 3306 │ 0           │ Master, Synced, Running │      │
    └────────┴─────────────┴──────┴─────────────┴─────────────────────────┴──────┘
    $ maxctrl show server node3
    ┌─────────────────────┬───────────────────────────────────────────┐
    │ Server              │ node3                                     │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Address             │ 192.0.2.103                               │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Port                │ 3306                                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ State               │ Master, Synced, Running                   │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Version             │ 11.4.5-3-MariaDB-enterprise-log           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Last Event          │ master_up                                 │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Triggered At        │ Thu, 05 Aug 2021 20:22:26 GMT             │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Services            │ connection_router_service                 │
    │                     │ query_router_service                      │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Monitors            │ cluster_monitor                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Master ID           │ -1                                        │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Node ID             │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Slave Server IDs    │                                           │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Current Connections │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Total Connections   │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Max Connections     │ 1                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Statistics          │ {                                         │
    │                     │     "active_operations": 0,               │
    │                     │     "adaptive_avg_select_time": "0ns",    │
    │                     │     "connection_pool_empty": 0,           │
    │                     │     "connections": 1,                     │
    │                     │     "max_connections": 1,                 │
    │                     │     "max_pool_size": 0,                   │
    │                     │     "persistent_connections": 0,          │
    │                     │     "reused_connections": 0,              │
    │                     │     "routed_packets": 0,                  │
    │                     │     "total_connections": 1                │
    │                     │ }                                         │
    ├─────────────────────┼───────────────────────────────────────────┤
    │ Parameters          │ {                                         │
    │                     │     "address": "192.0.2.103",               │
    │                     │     "disk_space_threshold": null,         │
    │                     │     "extra_port": 0,                      │
    │                     │     "monitorpw": null,                    │
    │                     │     "monitoruser": null,                  │
    │                     │     "persistmaxtime": "0ms",              │
    │                     │     "persistpoolmax": 0,                  │
    │                     │     "port": 3306,                         │
    │                     │     "priority": 0,                        │
    │                     │     "proxy_protocol": false,              │
    │                     │     "rank": "primary",                    │
    │                     │     "socket": null,                       │
    │                     │     "ssl": false,                         │
    │                     │     "ssl_ca_cert": null,                  │
    │                     │     "ssl_cert": null,                     │
    │                     │     "ssl_cert_verify_depth": 9,           │
    │                     │     "ssl_cipher": null,                   │
    │                     │     "ssl_key": null,                      │
    │                     │     "ssl_verify_peer_certificate": false, │
    │                     │     "ssl_verify_peer_host": false,        │
    │                     │     "ssl_version": "MAX"                  │
    │                     │ }                                         │
    └─────────────────────┴───────────────────────────────────────────┘
    $ maxctrl list monitors
    ┌─────────────────┬─────────┬─────────────────────┐
    │ Monitor         │ State   │ Servers             │
    ├─────────────────┼─────────┼─────────────────────┤
    │ cluster_monitor │ Running │ node1, node2, node3 │
    └─────────────────┴─────────┴─────────────────────┘
    $ maxctrl show monitor cluster_monitor
    ┌─────────────────────┬──────────────────────────────────────────────────────┐
    │ Monitor             │ cluster_monitor                                      │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Module              │ galeramon                                            │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ State               │ Running                                              │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Servers             │ node1                                                │
    │                     │ node2                                                │
    │                     │ node3                                                │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Parameters          │ {                                                    │
    │                     │     ..                                               │
    │                     │ }                                                    │
    ├─────────────────────┼──────────────────────────────────────────────────────┤
    │ Monitor Diagnostics │ {                                                    │
    │                     │     ..                                               │
    │                     │ }                                                    │
    └─────────────────────┴──────────────────────────────────────────────────────┘
    $ maxctrl list services
    ┌───────────────────────────┬────────────────┬─────────────┬───────────────────┬─────────────────────┐
    │ Service                   │ Router         │ Connections │ Total Connections │ Servers             │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼─────────────────────┤
    │ connection_router_service │ readconnroute  │ 0           │ 0                 │ node1, node2, node3 │
    ├───────────────────────────┼────────────────┼─────────────┼───────────────────┼─────────────────────┤
    │ query_router_service      │ readwritesplit │ 1           │ 1                 │ node1, node2, node3 │
    └───────────────────────────┴────────────────┴─────────────┴───────────────────┴─────────────────────┘
    $ maxctrl show service query_router_service
    ┌─────────────────────┬─────────────────────────────────────────────────────────────┐
    │ Service             │ query_router_service                                        │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router              │ readwritesplit                                              │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ State               │ Started                                                     │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Started At          │ Thu Aug  5 20:23:38 2021                                    │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Current Connections │ 1                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Total Connections   │ 1                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Max Connections     │ 1                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Cluster             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Servers             │ node1                                                       │
    │                     │ node2                                                       │
    │                     │ node3                                                       │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Services            │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Filters             │                                                             │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Parameters          │ {                                                           │
    │                     │     "auth_all_servers": false,                              │
    │                     │     "causal_reads": "false",                                │
    │                     │     "causal_reads_timeout": "10000ms",                      │
    │                     │     "connection_keepalive": "300000ms",                     │
    │                     │     "connection_timeout": "0ms",                            │
    │                     │     "delayed_retry": false,                                 │
    │                     │     "delayed_retry_timeout": "10000ms",                     │
    │                     │     "disable_sescmd_history": false,                        │
    │                     │     "enable_root_user": false,                              │
    │                     │     "idle_session_pool_time": "-1000ms",                    │
    │                     │     "lazy_connect": false,                                  │
    │                     │     "localhost_match_wildcard_host": true,                  │
    │                     │     "log_auth_warnings": true,                              │
    │                     │     "master_accept_reads": false,                           │
    │                     │     "master_failure_mode": "fail_instantly",                │
    │                     │     "master_reconnection": false,                           │
    │                     │     "max_connections": 0,                                   │
    │                     │     "max_sescmd_history": 50,                               │
    │                     │     "max_slave_connections": 255,                           │
    │                     │     "max_slave_replication_lag": "0ms",                     │
    │                     │     "net_write_timeout": "0ms",                             │
    │                     │     "optimistic_trx": false,                                │
    │                     │     "password": "*****",                                    │
    │                     │     "prune_sescmd_history": true,                           │
    │                     │     "rank": "primary",                                      │
    │                     │     "retain_last_statements": -1,                           │
    │                     │     "retry_failed_reads": true,                             │
    │                     │     "reuse_prepared_statements": false,                     │
    │                     │     "router": "readwritesplit",                             │
    │                     │     "session_trace": false,                                 │
    │                     │     "session_track_trx_state": false,                       │
    │                     │     "slave_connections": 255,                               │
    │                     │     "slave_selection_criteria": "LEAST_CURRENT_OPERATIONS", │
    │                     │     "strict_multi_stmt": false,                             │
    │                     │     "strict_sp_calls": false,                               │
    │                     │     "strip_db_esc": true,                                   │
    │                     │     "transaction_replay": false,                            │
    │                     │     "transaction_replay_attempts": 5,                       │
    │                     │     "transaction_replay_max_size": 1073741824,              │
    │                     │     "transaction_replay_retry_on_deadlock": false,          │
    │                     │     "type": "service",                                      │
    │                     │     "use_sql_variables_in": "all",                          │
    │                     │     "user": "mxs",                                          │
    │                     │     "version_string": null                                  │
    │                     │ }                                                           │
    ├─────────────────────┼─────────────────────────────────────────────────────────────┤
    │ Router Diagnostics  │ {                                                           │
    │                     │     "avg_sescmd_history_length": 0,                         │
    │                     │     "max_sescmd_history_length": 0,                         │
    │                     │     "queries": 1,                                           │
    │                     │     "replayed_transactions": 0,                             │
    │                     │     "ro_transactions": 0,                                   │
    │                     │     "route_all": 0,                                         │
    │                     │     "route_master": 0,                                      │
    │                     │     "route_slave": 1,                                       │
    │                     │     "rw_transactions": 0,                                   │
    │                     │     "server_query_statistics": [                            │
    │                     │         {                                                   │
    │                     │             "avg_selects_per_session": 0,                   │
    │                     │             "avg_sess_duration": "0ns",                     │
    │                     │             "id": "node2",                                  │
    │                     │             "read": 1,                                      │
    │                     │             "total": 1,                                     │
    │                     │             "write": 0                                      │
    │                     │         }                                                   │
    │                     │     ]                                                       │
    │                     │ }                                                           │
    └─────────────────────┴─────────────────────────────────────────────────────────────┘
    $ sudo mariadb
    CREATE USER 'app_user'@'192.0.2.104' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.104';
    CREATE USER 'app_user'@'192.0.2.11' IDENTIFIED BY 'app_user_passwd';
    GRANT ALL ON test.* TO 'app_user'@'192.0.2.11';
    $ mariadb --host 192.0.2.104 --port 3307
          --user app_user --password
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬──────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host │ State   │ Service                   │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │ ::   │ Running │ connection_router_service │
    ├────────────────────────────┼──────┼──────┼─────────┼───────────────────────────┤
    │ query_router_listener      │ 3307 │ ::   │ Running │ query_router_service      │
    └────────────────────────────┴──────┴──────┴─────────┴───────────────────────────┘
    $ mariadb --host 192.0.2.104 --port 3308 \
          --user app_user --password
    SELECT @@global.hostname;
    
    +-------------------+
    | @@global.hostname |
    +-------------------+
    |             node2 |
    +-------------------+
    $ maxctrl list servers
    ┌────────┬─────────────┬──────┬─────────────┬─────────────────────────┬──────┐
    │ Server │ Address     │ Port │ Connections │ State                   │ GTID │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node1  │ 192.0.2.101 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node2  │ 192.0.2.102 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node3  │ 192.0.2.103 │ 3306 │ 0           │ Master, Synced, Running │      │
    └────────┴─────────────┴──────┴─────────────┴─────────────────────────┴──────┘
    $ maxctrl list listeners galerarouter
    ┌────────────────────────────┬──────┬───────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host  │ State   │ Service                   │
    ├────────────────────────────┼──────┼───────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │       │ Running │ connection_router_service │
    │ query_router_listener      │ 3307 │       │ Running │ query_router_service      │
    └────────────────────────────┴──────┴───────┴─────────┴───────────────────────────┘
    $ mariadb --host=192.0.2.104 --port=3307 \
          --user=app_user --password=app_user_passwd
    CREATE TABLE test.load_balancing_test (
       id INT PRIMARY KEY AUTO_INCREMENT,
       hostname VARCHAR(256)
    );
    INSERT INTO test.load_balancing_test (hostname)
    VALUES (@@global.hostname);
    SELECT * FROM test.load_balancing_test;
    +----+----------+
    | id | hostname |
    +----+----------+
    |  1 | node3    |
    |  4 | node3    |
    |  7 | node3    |
    +----+----------+
    $ maxctrl list servers
    ┌────────┬─────────────┬──────┬─────────────┬─────────────────────────┬──────┐
    │ Server │ Address     │ Port │ Connections │ State                   │ GTID │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node1  │ 192.0.2.101 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node2  │ 192.0.2.102 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├────────┼─────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ node3  │ 192.0.2.103 │ 3306 │ 0           │ Master, Synced, Running │      │
    └────────┴─────────────┴──────┴─────────────┴─────────────────────────┴──────┘
    $ maxctrl list listeners
    ┌────────────────────────────┬──────┬───────┬─────────┬───────────────────────────┐
    │ Name                       │ Port │ Host  │ State   │ Service                   │
    ├────────────────────────────┼──────┼───────┼─────────┼───────────────────────────┤
    │ connection_router_listener │ 3308 │       │ Running │ connection_router_service │
    │ query_router_listener      │ 3307 │       │ Running │ query_router_service      │
    └────────────────────────────┴──────┴───────┴─────────┴───────────────────────────┘
    $ mariadb --host=192.0.2.104 --port=3307 \
       --user=app_user --password=app_user_passwd
    SELECT @@global.hostname;
    
    +-------------------+
    | @@global.hostname |
    +-------------------+
    |             node2 |
    +-------------------+
    Recommended Storage Options
    Recommended Storage Options
    CMAPI
    CMAPI
    shared local storage
    Storage Manager directory
    Shared Local Storage
    Storage Manager directory
    Storage Manager directory
    Recommended Storage Options

    Community Server with ColumnStore

    These instructions detail the deployment of MariaDB ColumnStore 6 with MariaDB Community Server 10.6 in a Single-node ColumnStore Deployment configuration on a range of supported Operating Systems.

    These instructions detail how to deploy a single-node columnar database, which is suited for an analytical or OLAP workload that does not require high availability (HA). This deployment type is generally for non-production use cases, such as for development and testing.

    Community Server Components

    These instructions detail the deployment of the following MariaDB Community Server components:

    Component
    Description

    Term Definitions

    Term
    Definition

    High Availability

    Single-node ColumnStore 6 does not support high availability.

    For high availability and scalability, instead see "" or "".

    System Preparation

    Systems hosting a ColumnStore deployment requires some additional configuration prior to installation:

    Optimize Linux Kernel Parameters

    MariaDB ColumnStore performs best when certain Linux kernel parameters are optimized.

    1. Set the relevant kernel parameters in a sysctl configuration file. For proper change management, we recommend setting them in a ColumnStore-specific configuration file.

      For example, create a /etc/sysctl.d/90-mariadb-columnstore.conf file with the following contents:

    2. Set the same kernel parameters at runtime using the sysctl command:

    LSM Configuration for Install

    To avoid confusion and potential problems, we recommend configuring the system's Linux Security Module (LSM) during installation. The specific steps to configure the security module will depend on the platform.

    In the section, we will configure the security module and restart it.

    SELinux (RHEL, CentOS)

    SELinux must be set to permissive mode before installing MariaDB ColumnStore.

    1. Set SELinux to permissive mode by setting SELINUX=permissive in /etc/selinux/config.

      For example, the file will usually look like this after the change:

    2. Reboot the system.

    3. Confirm that SELinux is in permissive mode using getenforce

    Remember to after the installation is complete.

    AppArmor (Debian, Ubuntu)

    AppArmor must be disabled before installing MariaDB ColumnStore.

    1. Disable AppArmor:

    2. Reboot the system.

    3. Confirm that no AppArmor profiles are loaded using aa-status:

      Example output:

    Remember to after the installation is complete.

    Configure the Character Encoding

    When using MariaDB ColumnStore, it is recommended to set the system's locale to UTF-8.

    1. On RHEL 8, install additional dependencies.

    2. Set the system's locale to en_US.UTF-8 by executing localedef:

    S3-Compatible Storage

    MariaDB ColumnStore supports S3-compatible object storage.

    S3-compatible object storage is optional, but highly recommended.

    S3-compatible object storage is:

    • Compatible: Many object storage services are compatible with the Amazon S3 API.

    • Economical: S3-compatible object storage is often very low cost.

    • Flexible: S3-compatible object storage is available for both cloud and on-premises deployments.

    • Limitless: S3-compatible object storage is often virtually limitless.

    Many S3-compatible object storage services exist. MariaDB Corporation cannot make guarantees about all S3-compatible object storage services, because different services provide different functionality.

    If you have any questions about using specific S3-compatible object storage with MariaDB ColumnStore, .

    Create an S3 Bucket

    If you want to use S3-compatible storage, it is important to create the S3 bucket before you start ColumnStore.

    If you already have an S3 bucket, confirm that the bucket is empty.

    We will configure ColumnStore to use the S3 bucket later in the section.

    The specific steps to create the S3 bucket will depend on what S3-compatible storage you are using.

    ColumnStore Installation

    MariaDB Corporation provides package repositories for YUM (RHEL, CentOS) and APT (Debian, Ubuntu).

    MariaDB ColumnStore ships as a storage engine plugin for MariaDB Community Server and a platform engine to handle back-end storage processes. MariaDB Community Server 10.6 does not require any additional software to operate as a single-node analytics database.

    Install ColumnStore via YUM (RHEL, CentOS)

    1. Configure the YUM package repository.

      MariaDB ColumnStore 6 is available on MariaDB Community Server 10.6.

      To configure YUM package repositories:

      1. Checksums of the various releases of the mariadb_repo_setup script can be found in the section at the bottom of the page. Substitute

    Install ColumnStore via APT (Debian, Ubuntu)

    1. Configure the APT package repository.

      MariaDB ColumnStore 6 is available on MariaDB Community Server 10.6.

      To configure APT package repositories:

      1. Checksums of the various releases of the mariadb_repo_setup script can be found in the section at the bottom of the page. Substitute

    ColumnStore Configuration

    MariaDB ColumnStore requires configuration after it is installed. The configuration file location depends on your operating system.

    Community Server Configuration

    MariaDB Community Server can be configured in the following ways:

    • and can be set in a configuration file (such as /etc/my.cnf). MariaDB Community Server must be restarted to apply changes made to the configuration file.

    • and can be set on the command-line.

    • If a system variable supports dynamic changes, then it can be set on-the-fly using the statement.

    Configuration Files

    MariaDB's packages include several bundled configuration files. It is also possible to create custom configuration files.

    On RHEL and CentOS, MariaDB's packages bundle the following configuration files:

    • /etc/my.cnf

    • /etc/my.cnf.d/client.cnf

    • /etc/my.cnf.d/mysql-clients.cnf

    And on RHEL and CentOS, custom configuration files from the following directories are read by default:

    • /etc/my.cnf.d/

    On Debian and Ubuntu, MariaDB's packages bundle the following configuration files:

    • /etc/mysql/my.cnf

    • /etc/mysql/mariadb.cnf

    • /etc/mysql/mariadb.conf.d/50-client.cnf

    And on Debian and Ubuntu, custom configuration files from the following directories are read by default:

    • /etc/mysql/conf.d/

    • /etc/mysql/mariadb.conf.d/

    Configuring MariaDB for ColumnStore

    1. Determine which and you need to configure.

      Mandatory system variables and options for single-node MariaDB ColumnStore include:

    Connector
    MariaDB Connector/R2DBC
    1. Choose a configuration file in which to configure your system variables and options.

    We recommend not making custom changes to one of the bundled configuration files. Instead, create a custom configuration file in one of the included directories. Configuration files in included directories are read in alphabetical order. If you want your custom configuration file to override the bundled configuration files, it is a good idea to prefix the custom configuration file's name with a string that will be sorted last, such as z-.

    • On RHEL and CentOS, a good custom configuration file would be: /etc/my.cnf.d/z-custom-my.cnf

    • On Debian and Ubuntu, a good custom configuration file would be: /etc/mysql/mariadb.conf.d/z-custom-my.cnf

    1. Set your system variables and options in the configuration file. They need to be set in a group that will be read by , such as [mariadb] or [server]. For example:

    Configure Cross Engine Joins

    When a cross engine join is executed, the ExeMgr process connects to the server using the root user with no password by default. MariaDB Community Server 10.6 will reject this login attempt by default. If you plan to use Cross Engine Joins, you need to configure ColumnStore to use a different user account and password. These directions are for configuring the cross engine join user. Directions for creating the cross engine join user are in the section.

    To configure cross engine joins, perform the following steps, use the mcsSetConfig command.

    For example, to configure ColumnStore to use the cross_engine user account to connect to the server at 127.0.0.1:

    Please choose a password that meets your organization's password policies. If your MariaDB Community Server instance has a password validation plugin installed, then the password should also meet the configured requirements.

    Configure the S3 Storage Manager

    MariaDB ColumnStore can use , but it is not required. S3-compatible storage must be configured before it can be used.

    To configure ColumnStore to use S3-compatible storage, edit /etc/columnstore/storagemanager.cnf:

    • The default local cache size is 2 GB.

    • The default local cache path is /var/lib/columnstore/storagemanager/cache.

    • Ensure that the local cache path has sufficient store space to store the local cache.

    • The bucket

    Start the ColumnStore Processes

    The Community Server and ColumnStore processes can be started using the systemctl command. In case the processes were started during the installation process, use the restart command to ensure that the processes pick up the new configuration. Perform the following procedure.

    1. Start the MariaDB Community Server process and configure it to start automatically:

    2. Start the MariaDB ColumnStore processes and configure them to start automatically:

    Create User Accounts

    For single-node ColumnStore deployments, only a single user account needs to be created.

    Create the Cross Engine Join User

    The credentials for cross engine joins were previously configured in the section. The user account must also be created and granted the necessary privileges to access data.

    1. Connect to the server using using the root@localhost user account:

    2. Create the user account with the statement:

    Please choose the same user name and password that was configured in the section.

    1. Grant the user account SELECT privileges on all databases with the statement:

    Bulk Import Data

    Now that the ColumnStore system is running, you can bulk import your data.

    Import the Schema

    Before data can be imported into the tables, the schema needs to be created.

    1. Connect to the server using using the root@localhost user account:

    2. For each database that you are importing, create the database with the statement:

    3. For each table that you are importing, create the table with the statement:

    cpimport

    MariaDB ColumnStore includes cpimport, which is a command-line utility that is designed to efficiently load data in bulk.

    To import your data from a TSV (tab-separated values) file with cpimport:

    LOAD DATA INFILE

    When data is loaded with the statement, MariaDB ColumnStore loads the data using , which is a command-line utility that is designed to efficiently load data in bulk.

    To import your data from a TSV (tab-separated values) file with statement:

    Import from Remote Database

    MariaDB ColumnStore can also import data directly from a remote database. A simple method is to query the table using the statement, and then pipe the results into cpimport, which is a command-line utility that is designed to efficiently load data in bulk.

    To import your data from a remote MariaDB database:

    Configure the Linux Security Module

    If you stopped the Linux Security Module (LSM) during installation, you can restart the module and configure.

    The specific steps to configure the security module depend on the operating system.

    Configure SELinux (RHEL, CentOS)

    We set SELinux to permissive mode in the section, but we have to create an SELinux policy for ColumnStore before re-enabling it. This will ensure that SELinux does not interfere with ColumnStore's functionality. A policy can be generated while SELinux is still in permissive mode using the audit2allow command.

    1. To configure SELinux, you have to install the packages required for audit2allow.

      On RHEL 7 and CentOS 7, install the following:

      On RHEL 8, install the following:

    2. Allow the system to run under load for a while to generate SELinux audit events.

    3. After the system has taken some load, generate an SELinux policy from the audit events using audit2allow:

    Configure AppArmor (Debian, Ubuntu)

    We disabled AppArmor in the section, but we have to create an AppArmor profile for ColumnStore before re-enabling it. This will ensure that AppArmor does not interfere with ColumnStore's functionality.

    For information on how to create a profile, see on ubuntu.com.

    Administration

    ColumnStore has several components. Each of those components needs to be administered.

    Community Server Administration

    MariaDB Community Server uses systemctl to start and stop the server processes:

    Operation
    Command

    ColumnStore Administration

    MariaDB ColumnStore uses systemctl to start and stop the ColumnStore processes:

    Operation
    Command

    Testing

    When you have MariaDB ColumnStore up and running, you should test it to ensure that it is in working order and that there were not any issues during startup.

    Checking Server Status

    1. Connect to the server using using the root@localhost user account:

    :

    Resilient: S3-compatible object storage is often low maintenance and highly available, since many services use resilient cloud infrastructure.

  • Scalable: S3-compatible object storage is often highly optimized for read and write scaling.

  • Secure: S3-compatible object storage is often encrypted-at-rest.

  • ${checksum}
    in the example above with the latest checksum.
  • Install the EPEL repository:

  • Install some additional dependencies for ColumnStore:

  • Install MariaDB ColumnStore and package dependencies:

  • Configure MariaDB ColumnStore.

    Installation only loads MariaDB ColumnStore to the system. MariaDB ColumnStore requires configuration and additional post-installation steps before the database server is ready for use.

    See ColumnStore Configuration.

  • ${checksum}
    in the example above with the latest checksum.
  • Install some additional dependencies for ColumnStore.

    On Debian 10 and Ubuntu 20.04, install the following:

    On Debian 9 and Ubuntu 18.04, install the following:

  • Install MariaDB ColumnStore and package dependencies:

  • Configure MariaDB ColumnStore.

    Installation only loads MariaDB ColumnStore to the system. MariaDB ColumnStore requires configuration and additional post-installation steps before the database server is ready for use.

    See ColumnStore Configuration.

  • /etc/my.cnf.d/server.cnf
    /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
  • /etc/mysql/mariadb.conf.d/50-mysqld_safe.cnf

  • /etc/mysql/mariadb.conf.d/50-server.cnf

  • /etc/mysql/mariadb.conf.d/60-galera.cnf

  • option must be set to the name of the bucket that you created in the
    step.
  • To use an IAM role, you must also uncomment and set iam_role_name, sts_region, and sts_endpoint.

  • If no audit events were found, this will print the following:
  • If audit events were found, the new SELinux policy can be loaded using semodule:

  • Set SELinux to enforcing mode by setting SELINUX=enforcing in /etc/selinux/config:

  • Reboot the system.

  • Confirm that SELinux is in enforcing mode using getenforce:

  • MariaDB ColumnStore 6

    • It is a columnar storage engine that provides distributed, columnar storage for scalable analytical processing and smart transactions.

    • It is the analytical component of MariaDB's single stack Hybrid Transactional/Analytical Processing (HTAP) solution.

    columnar database

    • A database where the columns of each row are stored separately.

    • Best suited for analytical and OLAP workloads.

    • Also known as a "column-oriented database".

    row database

    • A database where all columns of each row are stored together.

    • Best suited for transactional and OLTP workloads.

    • Also known as a "row-oriented database".

    character_set_server

    Set this system variable to utf8

    collation_server

    Set this system variable to utf8_general_ci

    columnstore_use_import_for_batchinsert

    Set this system variable to ALWAYS to always use cpimport for LOAD DATA INFILE and INSERT...SELECT statements.

    Start

    sudo systemctl start mariadb

    Stop

    sudo systemctl stop mariadb

    Restart

    sudo systemctl restart mariadb

    Enable during startup

    sudo systemctl enable mariadb

    Disable during startup

    sudo systemctl disable mariadb

    Status

    sudo systemctl status mariadb

    Start

    sudo systemctl start mariadb-columnstore

    Stop

    sudo systemctl stop mariadb-columnstore

    Restart

    sudo systemctl restart mariadb-columnstore

    Enable during startup

    sudo systemctl enable mariadb-columnstore

    Disable during startup

    sudo systemctl disable mariadb-columnstore

    Status

    sudo systemctl status mariadb-columnstore

    ColumnStore Object Storage Topology
    ColumnStore Shared Local Storage Topology
    Optimize Linux kernel parameters
    Configure the Linux security module to support installation
    Configure the character encoding
    Optionally configure S3-compatible storage
    Configure the Linux Security Module
    configure and re-enable SELinux
    configure and re-enable AppArmor
    contact us
    Configure the S3 Storage Manager
    Versions
    MariaDB Package Repository Setup and Usage
    Versions
    MariaDB Package Repository Setup and Usage
    System variables
    options
    System variables
    options
    SET
    system variables
    options
    mariadbd
    Create the Cross Engine Join User
    S3-compatible storage
    MariaDB Client
    CREATE USER
    Cross Engine Joins
    GRANT
    mariadb Client
    CREATE DATABASE
    CREATE TABLE
    LOAD DATA INFILE
    LOAD DATA INFILE
    SELECT
    SELinux
    AppArmor
    How to create an AppArmor Profile
    mariadb Client

    This page is: Copyright © 2025 MariaDB. All rights reserved.

    Cross Engine Joins
    cpimport
    Create an S3 Bucket
    $ sudo yum install epel-release
    $ sudo yum install jemalloc
    $ sudo yum install MariaDB-server MariaDB-backup \
       MariaDB-shared MariaDB-client \
       MariaDB-columnstore-engine
    $ sudo apt install libjemalloc2
    $ sudo apt install libjemalloc1
    $ sudo apt install mariadb-server mariadb-backup \
       libmariadb3 mariadb-client \
       mariadb-plugin-columnstore
    $ sudo semodule -i mariadb_local.pp
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo getenforce
    # minimize swapping
    vm.swappiness = 1
    
    # Increase the TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    
    # Increase the TCP buffer limits
    # min, default, and max number of bytes to use
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    
    # don't cache ssthresh from previous connection
    net.ipv4.tcp_no_metrics_save = 1
    
    # for 1 GigE, increase this to 2500
    # for 10 GigE, increase this to 30000
    net.core.netdev_max_backlog = 2500
    $ sudo sysctl --load=/etc/sysctl.d/90-mariadb-columnstore.conf
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    $ sudo systemctl disable apparmor
    $ sudo aa-status
    apparmor module is loaded.
    0 profiles are loaded.
    0 profiles are in enforce mode.
    0 profiles are in complain mode.
    0 processes have profiles defined.
    0 processes are in enforce mode.
    0 processes are in complain mode.
    0 processes are unconfined but have a profile defined.
    $ sudo yum install glibc-locale-source glibc-langpack-en
    $ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
    $ sudo yum install curl
    $ curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup
    $ echo "${checksum} mariadb_repo_setup" \
        | sha256sum -c -
    $ chmod +x mariadb_repo_setup
    $ sudo ./mariadb_repo_setup \
       --mariadb-server-version="mariadb-10.6"
    $ sudo apt install curl
    $ curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup
    $ echo "${checksum} mariadb_repo_setup" \
        | sha256sum -c -
    $ chmod +x mariadb_repo_setup
    $ sudo ./mariadb_repo_setup \
       --mariadb-server-version="mariadb-10.6"
    $ sudo apt update
    [mariadb]
    log_error                              = mariadbd.err
    character_set_server                   = utf8
    collation_server                       = utf8_general_ci
    $ sudo mcsSetConfig CrossEngineSupport Host 127.0.0.1
    $ sudo mcsSetConfig CrossEngineSupport Port 3306
    $ sudo mcsSetConfig CrossEngineSupport User cross_engine
    $ sudo mcsSetConfig CrossEngineSupport Password cross_engine_passwd
    [ObjectStorage]
    …
    service = S3
    …
    [S3]
    bucket = your_columnstore_bucket_name
    endpoint = your_s3_endpoint
    aws_access_key_id = your_s3_access_key_id
    aws_secret_access_key = your_s3_secret_key
    # iam_role_name = your_iam_role
    # sts_region = your_sts_region
    # sts_endpoint = your_sts_endpoint
    
    [Cache]
    cache_size = your_local_cache_size
    path = your_local_cache_path
    $ sudo systemctl restart mariadb
    $ sudo systemctl enable mariadb
    $ sudo systemctl restart mariadb-columnstore
    $ sudo systemctl enable mariadb-columnstore
    $ sudo mariadb
    CREATE USER 'cross_engine'@'127.0.0.1'
       IDENTIFIED BY "cross_engine_passwd";
    CREATE USER 'cross_engine'@'localhost'
       IDENTIFIED BY "cross_engine_passwd";
    GRANT SELECT, PROCESS ON *.*
       TO 'cross_engine'@'127.0.0.1';
    GRANT SELECT, PROCESS ON *.*
       TO 'cross_engine'@'localhost';
    $ sudo mariadb
    CREATE DATABASE inventory;
    CREATE TABLE inventory.products (
       product_name VARCHAR(11) NOT NULL DEFAULT '',
       supplier VARCHAR(128) NOT NULL DEFAULT '',
       quantity VARCHAR(128) NOT NULL DEFAULT '',
       unit_cost VARCHAR(128) NOT NULL DEFAULT ''
    ) ENGINE=Columnstore DEFAULT CHARSET=utf8;
    $ sudo cpimport -s '\t' inventory products /tmp/inventory-products.tsv
    LOAD DATA INFILE '/tmp/inventory-products.tsv'
    INTO TABLE inventory.products;
    $ mariadb --quick \
       --skip-column-names \
       --execute="SELECT * FROM inventory.products" \
       | cpimport -s '\t' inventory products
    $ sudo yum install policycoreutils policycoreutils-python
    $ sudo yum install policycoreutils python3-policycoreutils policycoreutils-python-utils
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    $ sudo mariadb
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 38
    Server version: 10.6.21-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]>
    $ sudo getenforce
    Permissive
    $ sudo grep mysqld /var/log/audit/audit.log | audit2allow -M mariadb_local
    Nothing to do
    Global Settings
    REST API
    MaxCtrl
    MaxGUI
    REST API
    Deploy MariaDB Enterprise Spider
    enterprise lifecycle
    enterprise lifecycle
    Deploy MariaDB Enterprise Spider
    enterprise lifecycle
    enterprise lifecycle
    enterprise lifecycle
    enterprise lifecycle
    Cluster Management API (CMAPI)