Use MySQL as Metadata DB
Kylin support using MySQL as Metastore DB, this chapter will introduce how to install and configure MySQL as Metastore DB.
Prerequisite
- 
Supported MySQL versions are: - MySQL 5.1 to 5.7, MySQL 5.7 is recommended
- MySQL 8
 
- 
JDBC driver of MySQL is needed in the Kylin running environment. 
- 
You can download the JDBC driver jar package of MySQL 8 via the link below, that compatible with the version after 5.6: https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar For other versions, you will have to prepare independently. 
- 
Please put the corresponding MySQL's JDBC driver to directory $KYLIN_HOME/lib/ext.
Non-Root User Installation
The followings are the steps for a non root user abc installing MySQL 5.7 on CentOS 7( apply to root users as well).
- 
Create a new directory /home/abc/mysql, and locate MySQL intallation package in the directory, excute the following command to unzip the package ofrpm:cd /home/abc/mysql
 tar -xvf mysql-5.7.37-1.el7.x86_64.rpm-bundle.tarThen you will have the RPM installment package: mysql-community-common-5.7.37-1.el7.x86_64.rpmmysql-community-libs-5.7.37-1.el7.x86_64.rpmmysql-community-client-5.7.37-1.el7.x86_64.rpmmysql-community-server-5.7.37-1.el7.x86_64.rpmmysql-community-devel-5.7.37-1.el7.x86_64.rpmNote: please prepare MySQL installaion package by yourself 
- 
To check if the other version MySQL was already installed in your system environment For example 1:
 rpm -qa | grep mysql
 yum -y remove MySQL-server-5.5.61-1.el6.x86_64
 For example 2:
 rpm -qa | grep mariadb
 yum -y remove mariadb-libs-5.5.68-1.el7.x86_64
- 
Excute the command as the following order to Unzip package of rpmfollowingrpm2cpio mysql-community-common-5.7.37-1.el7.x86_64.rpm | cpio -idmv
 rpm2cpio mysql-community-libs-5.7.37-1.el7.x86_64.rpm | cpio -idmv
 rpm2cpio mysql-community-client-5.7.37-1.el7.x86_64.rpm | cpio -idmv
 rpm2cpio mysql-community-server-5.7.37-1.el7.x86_64.rpm | cpio -idmv
- 
Excute vi ~/mysql/etc/my.cnfto edit configuration file, and please add the configuration informationn as follows[client]
 port = 3306
 socket=/home/abc/socket/mysql.sock
 [mysql]
 no-auto-rehash
 socket=/home/abc/socket/mysql.sock
 [mysqld]
 user=abc
 basedir=/home/abc/mysql/usr
 datadir=/home/abc/sql_data
 socket=/home/abc/socket/mysql.sock
 secure-file-priv=/home/abc/mysql_files
 port=3306Please create folders corresponding to the configuration informantion above : - Create folder usrin the path of/home/abc/mysql
- Create folder sql_datain the path of/home/abc
- Create folder socketin the path of/home/abc
- Create folder mysql_filesin the path of/home/abc
 Then, excute the following command in the path of /home/abc/mysql./usr/bin/mysql_install_db --defaults-file=etc/my.cnf --user=abc --basedir=/home/abc/mysql/usr --datadir=/home/abc/sql_data
- Create folder 
- 
Excute following command to start MySQL in the path of /home/abc/mysql:./usr/sbin/mysqld --defaults-file=etc/my.cnf &
- 
To check the default password of MySQL 5.7 cat ./home/abc/.mysql_secretLogin MySQL 5.7 by using default password usr/bin/mysql -u root -p
Configure MySQL as Metastore
The following steps illustrate how to connect MySQL as metastore. Here is an example for MySQL 5.7 .
- 
Create database kylinin MySQL
- 
Set configuration item kylin.metadata.url = {metadata_name}@jdbcin$KYLIN_HOME/conf/kylin.properties, please replace{metadata_name}with your metadata name in MySQL, for example,kylin_default_instance@jdbc, the maximum length of{metadata_name}allowed is 29.Note: If the metadata name doesn't exist, it will be automatically created in MySQL. Otherwise, Kylin will use the existing one. For example: kylin.metadata.url={metadata_name}@jdbc,driverClassName=com.mysql.jdbc.Driver,url=jdbc:mysql://{host}:{port}/kylin?useUnicode=true&characterEncoding=utf8,username={user},password={password},maxTotal=50,maxIdle=8The meaning of each parameter is as below, url,username, andpasswordare required parameters. For others, default values will be used if they are not indicated.- driverClassName: JDBC's driver class name, default value is com.mysql.jdbc.Driver;
- url: JDBC's url;
- host:MySQL ip address, whose default value is localhost;
- port:MySQL port, whose default value is 3306. Please use the actual port to replace.
- kylin: Metabase name. Make sure this database kylinhas been created in MySQL;
 
- host:MySQL ip address, whose default value is 
- username: JDBC's username;
- password: JDBC's password;
- maxTotal: max number of database's connection number, default value is 50;
- maxIdle: max number of database's waiting connection number, default value is 8;
 
- driverClassName: JDBC's driver class name, default value is 
Note: if your query SQL contains chinese, please configure the character encoding to utf8 in kylin.metadata.url to avoid confusing query history: useunicode = true & character encoding = utf8
- 
Encrypt JDBC password If you need to encrypt JDBC's password, you can do it like this: i. run following commands in ${KYLIN_HOME}, it will print encrypted password./bin/kylin.sh org.apache.kylin.tool.general.CryptTool -e AES -s <password>ii. config properties kylin.metadata.url's password like this password=ENC('${encrypted_password}')For example, the following assumes that the JDBC password is kylin: First, we need to encrypt kylin using the following command ${KYLIN_HOME}/bin/kylin.sh org.apache.kylin.tool.general.CryptTool -e AES -s kylin
 AES encrypted password is:
 YeqVr9MakSFbgxEec9sBwg==Then, config kylin.metadata.url like this: kylin.metadata.url={metadata_name}@jdbc,driverClassName=com.mysql.jdbc.Driver,url=jdbc:mysql://{host}:{port}/kylin?useUnicode=true&characterEncoding=utf8,username={user},password=ENC('YeqVr9MakSFbgxEec9sBwg=='),maxTotal=20,maxIdle=20
- 
If you need to use MySQL cluster deployment, please add replicationorloadbalancein url with". For example:#use replication in cluster deployment
 kylin.metadata.url=kylin_default_instance@jdbc,driverClassName=com.mysql.jdbc.Driver,url="jdbc:mysql:replication://localhost:3306,localhost:3307/kylin?useUnicode=true&characterEncoding=utf8",username=root,password=,maxTotal=20,maxIdle=20
 
 #use loadbalance in cluster deployment
 kylin.metadata.url=kylin_default_instance@jdbc,driverClassName=com.mysql.jdbc.Driver,url="jdbc:mysql:loadbalance://localhost:3306,localhost:3307/kylin?useUnicode=true&characterEncoding=utf8",username=root,password=,maxTotal=20,maxIdle=20
- 
Make sure that the storage engine used with MySQL is InnoDB is not MyISAM and that the default storage engine is modified as follows: [mysqld]
 default-storage-engine=InnoDB
FAQ
**Q: After the JDK is upgraded to jdk 8u261, the startup of Kylin fails, indicating that the creation of the admin user failed, what should I do? **
A: When you use JDK 8u261 and use MySQL 5.6 or 5.7 as metastore. Since the version before TLS 1.2 has been disabled since the JDK 8u261, and MySQL 5.6 and 5.7 use TLS 1.0 or TLS 1.1 by default, and MySQL must establish an SSL connection by default, which causes conflicts with the TLS protocol, resulting in the startup of Kylin fails, you will see the error message on the terminal as Create Admin user failed.
You have 2 solutions:
Method 1: Modify the metadata configuration parameters and add useSSL=false
kylin.metadata.url={metadata_name}@jdbc,driverClassName=com.mysql.jdbc.Driver,url=jdbc:mysql://{host}:{port}/kylin?useSSL=false,useUnicode=true&characterEncoding=utf8,username={user},password={password},maxTotal=50,maxIdle=8
Method 2: Modify the java security file java.security, find the following configuration, delete TLSv1, TLSv1.1
#  jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves