20201028のMySQLに関する記事は17件です。

[SQL] データベースを削除する手順

データベースを間違えて作ってしまうこともあるので、忘備録として記録します。
今回はMySQLを使用していきます。

MySQLに接続

  • -u rootオプションを使っていますが、この「ルート」はMySQLで元々用意されているユーザーです。
ターミナル
% mysql -u root

こんな感じで表示されればログイン完了です。

ターミナル
cd: too many arguments
kusakashiori@mba ~ % mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 300
Server version: 5.6.47 Homebrew

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

データベースを表示

  • データベースの一覧を表示して削除するデータベース名を確認しましょう。
ターミナル
mysql> SHOW DATABASES;

テーブルが表示されました。
今回はこちらの「test」を削除していきます。

ターミナル
+------------------------+
| Database               |
+------------------------+
| 省略                    |
| test                  |
| 省略                    |
+------------------------+

データベースを削除

ターミナル
mysql> DROP DATABASE test;

SHOW DATABASES;コマンドで確認すると削除されていることがわかります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【忘備録】Rubyをやってみて何度も調べたコマンド一覧

はじめに

Rubyを半年程さわってみて、調べる頻度が多かったコマンドをここでまとめてます。
初学者兼初投稿なのでコメントやLGTMなどでフィードバック頂けると励みになります。よろしくお願いします。

Ruby関連

rubyのバージョンを確認する
$ ruby -v

railsのバージョンを確認する
$ rails -v

credentials.yml.encのファイルを開く
$ EDITOR='code --wait' rails credentials:edit
(※vscodeでファイルを開くにはshellをインストールしてcodeコマンドを使えるようにする必要あり)

unicorn関連

起動状態を確認する
$ ps auxwww | grep unicorn

プロセスを終了する
$ kill -9 ○○○○○○

すべてのログを確認する ($ cd /var/www/app/log にて)
$ less unicorn.staderr.log

直近10件のログを確認する ($ cd /var/www/app/log にて)
$ tail unicorn.staderr.log

nginx関連

再起動する
$ sudo service nginx restart

すべてのログを確認する (本番環境のホームディレクトリにて)
$ sudo less /var/log/nginx/error.log

MySQL関連

起動状況を確認する
$ sudo service mysqld status

起動する
$ sudo service mysqld start

Capistrano関連

デプロイ実行
$ bundle exec cap production deploy

1つ前の状態にロールバック
$ bundle exec cap production deploy:rollback

本番環境まわりのコマンドばかりになってしまいましたが、過不足があれば随時更新していきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Computeインスタンス上にNode.jsのWebアプリケーション環境を構成して、MySQL Database ServiceのDBシステムにアクセスしてみた

はじめに

Computeインスタンス上に構成したNode.jsのWebアプリケーションから、MySQL Database ServiceのDBシステムにアクセスしてみた時の手順です。
(2020年10月現在)

構築イメージ

スクリーンショット 2020-10-28 19.50.40.png

作業の流れ

1.VCNの構成
2.ネットワーク・セキュリティ・グループの作成
3.MySQL DBシステムの作成
4.Computeインスタンス(APサーバ)の作成
5.パブリックIPの作成
6.ComputeインスタンスへのパブリックIPの割り当て
7.MySQLクライアントのインストールと設定
8.Node.jsのインストールと設定
9.firewalldの設定
10.SELinuxの設定
11.MySQL DBシステムの接続情報の確認
12.アプリケーションで使用するDBの準備
13.Node.jsアプリケーションの作成
14.Node.jsアプリケーションの動作確認

1.VCNの構成

こちらの記事を参考に、仮想クラウド・ネットワークを構成します。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

ここでは、以下の理由からMySQL DBシステムを独立したプライベート・サブネットに配置します。
・MySQL DBシステムはプライベート・エンドポイントのみを持つ。
・MySQL DBシステムにはネットワーク・セキュリティ・グループを適用できない。

そのため、参考記事のネットワーク構成に対して、以下の部分を変更します。

・Subnet2のセキュリティ・リスト(Security List for Subnet2)
APサーバを配置するサブネット(Subnet1:10.0.1.0/24)からのみ、MySQLへの接続で使用するTCP 3306、33060へのアクセスを許可します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 
 → 「仮想クラウドネットワークの詳細」 → 「セキュリティ・リスト」

「セキュリティ・リストの作成」をクリック
 ・ 名前:Security List for Subnet2
 ・コンパートメントに作成:「Compartment1」を選択
  ・「+追加のイングレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・ソース・タイプ:「CIDR」を選択
   ・ソースCIDR:10.0.1.0/24
   ・IPプロトコル:「TCP」を選択
   ・ソース・ポート範囲:入力しない
   ・宛先ポート範囲:3306
  ・「+追加のイングレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・ソース・タイプ:「CIDR」を選択
   ・ソースCIDR:10.0.1.0/24
   ・IPプロトコル:「TCP」を選択
   ・ソース・ポート範囲:入力しない
   ・宛先ポート範囲:33060
  ・「+追加のエグレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・宛先タイプ:「CIDR」を選択
   ・宛先CIDR:0.0.0.0/0
   ・IPプロトコル:「全てのプロトコル」を選択」
 ・「セキュリティ・リストの作成」をクリック

2.ネットワーク・セキュリティ・グループの作成

今回作成するNode.jsアプリケーションでTCP 8080でリクエストを受けるので、すべての場所からTCP 8080へのアクセスを許可するネットワーク・セキュリティ・グループを作成します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 → 「仮想クラウドネットワークの詳細」 → 「ネットワーク・セキュリティ・グループ」

「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for AP
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「CIDR」を選択
   ソース:0.0.0.0/0
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:8080
  説明:Security Rule for TCP 8080 **
 ・
「作成」をクリック**

3.MySQL DBシステムの作成

「コンソールメニュー」 → 「MySQL」 → 「DBシステム」

・「MySQL DBシステムの作成」をクリック

 DBシステムの基本情報情報
 ・コンパートメントの選択:「Compartment1」を選択
 ・DBシステムの名前の指定:MySQL1
 ・可用性ドメインの選択:任意の可用性ドメインを選択
 ・フォルト・ドメインの選択:任意のフォルト・ドメインを選択
 ・シェイプの選択:任意のシェイプを選択
 ・データ・ストレージ・サイズ(GB):任意のサイズを入力
 ・メンテナンス・ウィンドウの開始時間:入力しない
 ・「次」をクリック

 データベースの基本情報の指定
 ・管理者資格証明の作成
  ・ユーザー名:admin
  ・パスワード:Demo#1Demo#1
  ・パスワードの確認:Demo#1Demo#1
 ・ネットワーク情報の指定
  ・仮想クラウドネットワーク:「VCN1」を選択
  ・サブネット:「Subnet2」を選択
  ・ホスト名:mysql1
  ・MySQLポート:3306(デフォルト)
  ・MYSQL Xプロトコル・ポート:33060(デフォルト)
  ・「次」をクリック

 DBシステム・バックアップの基本情報の指定
 ・バックアップの構成
  ・自動バックアップの有効化:チェックをオン(デフォルト)
  ・バックアップ保持期間:7(デフォルト)
  ・バックアップ・ウィンドウの開始時間:デフォルト・バックアップ・ウィンドウ(デフォルト)
 
  ・「作成」をクリック

4.Computeインスタンス(APサーバ)の作成

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

・「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:「Compartment1」を選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスを割り当てないでください」を選択
 
 ・SSHキーの追加
  ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ・ブートボリュームの構成
  ・全てデフォルトのまま

 ・「拡張オプションの表示」をクリック
  ・「管理」タブ
   ・全てデフォルトのまま
  ・「ネットワーキング」タブ
   ・プライベートIPアドレス:10.0.1.100
   ・ホスト名:ap1
   ・起動オプション:デフォルトのまま
  ・「イメージ」タブ
   ・デフォルトのまま
  ・「配置」タブ
   ・デフォルトのまま
「作成」をクリック

5.パブリックIPの作成

「コンソールメニュー」 → 「ネットワーキング」 → 「IP Management」

「パブリックIPアドレスの予約」をクリック

 ・予約済パブリックIPアドレス名:PublicIP1
 ・コンパートメントに作成:「Compartment1」を選択
 ・IPアドレスのソース:「Oracle」を選択

 ・「パブリックIPアドレスの予約」をクリック

6.ComputeインスタンスへのパブリックIPの割り当て

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」 → 「インスタンスの詳細」

・リソース欄の「アタッチされたVNIC」をクリック
VNIC名(AP1)をクリック
・リソース欄の「IPアドレス」をクリック
IPアドレスの欄の「:」をクリックし、「編集」をクリック
 ・パブリックIPタイプ:「予約済パブリックIP」を選択
 ・「既存の予約済パブリックIPの選択」を選択
 ・RESERVED IP ADDRESS:「PublicIP1」を選択
「更新」をクリック

7.MySQLクライアントのインストールと設定

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

タイムゾーンとロケールを設定します。

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

yumコマンドでMySQLクライアントをインストールします。

sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-community-client

8.Node.jsのインストールと設定

yumコマンドでNode.jsインストールをインストールします。

sudo yum install -y oracle-release-el7 oracle-nodejs-release-el7
sudo yum install -y --disablerepo=ol7_developer_EPEL nodejs

npmコマンドで使用するNode.jsモジュール(expressフレームワーク、ejs)をインストールします。

sudo npm install -g --save express-generator
sudo npm install -g --save ejs

9.firewalldの設定

firewall-cmdコマンドでfirewalldにTCP8080の通信を許可する設定を追加します。

sudo firewall-cmd --add-port 8080/tcp --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public

10.SELinuxの設定

SELinuxの設定を変更します。

sudo setenforce 0

再起動後にSELinuxが有効にならないように設定ファイルを変更します。

sudo vi /etc/selinux/config
/etc/selinux/config
SELINUX=enforcing

の部分を以下のように変更して保存します。

/etc/selinux/config
SELINUX=permissive

11.MySQL DBシステムの接続情報の確認

「コンソール」 → 「MySQL DBシステム」 → 「MySQL DBシステム」

リソース欄の「エンドポイント」をクリックし、MySQL DBシステムのエンドポイント(ホスト、ポート)を確認します。
スクリーンショット 2020-10-28 21.00.05.png

12.アプリケーションで使用するDBの準備

DB接続情報を含む、MySQLクライアントの設定ファイルを作成します。

vi /home/opc/.my.cnf
/home/opc/.my.cnf
[client]
user=admin
password="Demo#1Demo#1"
host="mysql1.subnet2.vcn1.oraclevcn.com"

mysqlコマンドででMySQLに接続に接続します。

mysql

アプリケーションで使用するDBを作成します。

mysql> CREATE DATABASE testdb;

アプリケーションで使用するDBユーザを作成します。

mysql> CREATE USER 'test' IDENTIFIED BY 'Demo#1Demo#1';

アプリケーションで使用するDBユーザに権限を付与します。

mysql> GRANT ALL ON testdb.* TO 'test';

アプリケーションで使用するDBに接続します。

mysql> USE testdb

アプリケーションで使用するテーブルを作成します。

mysql> CREATE TABLE dept (
    -> deptno INT ,
    -> dname VARCHAR(14),
    -> loc VARCHAR(13) ,
    -> PRIMARY KEY  (deptno) 
    -> );

アプリケーションで使用するテーブルにデータを挿入します。

mysql> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
mysql> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
mysql> INSERT INTO dept VALUES (30,'SALES','CHICAGO');
mysql> INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
mysql> COMMIT;

アプリケーションで使用するテーブルのデータを確認します。

mysql> SELECT * FROM dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

mysqlコマンドを終了します。

mysql> exit

13.Node.jsアプリケーションの作成

今回はexpressフレームワークを使用してNode.jsアプリケーションを作成します。

opcユーザのホームディレクトリ直下に、expressコマンドでNode.jsアプリケーション環境を作成します。

cd /home/opc
express --view=ejs app

アプリケーション環境のディレクトリに移動し、npmコマンドで依存関係のあるモジュールをインストールします。

cd app
npm install

npmコマンドでMySQLにアクセスするために使用する@mysql/xdevapiモジュールをインストールします。

npm install --save @mysql/xdevapi 

app.jsを編集します。

vi /home/opc/app/app.js

末尾に以下の内容を追加します。

/home/opc/app/app.js
app.listen(8080);

routes/index.jsを編集します。

vi /home/opc/app/routes/index.js

以下の内容に書き換えます。

/home/opc/app/routes/index.js
var express = require('express');
var mysqlx = require('@mysql/xdevapi');
var router = express.Router();
var os = require('os');

mysqlx
  .getSession({
   user: 'test',
   password: 'Demo#1Demo#1',
   host: 'mysql1.subnet2.vcn1.oraclevcn.com',
   port: '33060'
   })
    .then(function (session) {
      var db = session.getSchema('testdb');
      var myTable = db.getTable('dept');
      var rows =  myTable
         .select()
         .execute()
         .then(res => {
           dept = res.fetchAll();
           hostname = os.hostname();
           console.log(dept);
           console.log(hostname);
         });
      router.get('/', function(req, res, next) {
        res.render('index',{dept: dept, hostname: hostname});
      });
    })
    .catch(function (err) {
       console.log('error: ' + err.stack);
            return;
    });

module.exports = router;

views/index.ejsを編集します。

vi /home/opc/app/views/index.ejs

以下の内容に書き換えます。

/home/opc/app/views/index.ejs
<html>
<head>
<meta charset="UTF-8">
<title>Node.js to MySQL DS Connection Test</title>
</head>
<body>
<table border='1'>
<caption>DEPT Table</caption>
<tr><th>Dept No.</th><th>Dept Name</th><th>Location</th></tr>
  <% dept.forEach(function(deptItem) { %>
    <tr>
    <td><%- deptItem[0] %></td>
    <td><%- deptItem[1] %></td>
    <td><%- deptItem[2] %></td>
    </tr>
  <% }); %>
</table><br>
Response from <%- hostname %>
</body>
</html>

14.Node.jsアプリケーションの動作確認

nodeコマンドでアプリケーションを実行します。

cd /home/opc/app
node app.js

PCのブラウザからアクセスして、アプリケーションの動作を確認します。

http://<AP1のグローバルIP>:8080

スクリーンショット 2020-10-28 21.21.13.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Computeインスタンス上にNode.jaのWebアプリケーション環境を構成して、MySQL Database ServiceのDBシステムにアクセスしてみた

はじめに

Computeインスタンス上に構成したNode.jsのWebアプリケーションから、MySQL Database ServiceのDBシステムにアクセスしてみた時の手順です。
(2020年10月現在)

構築イメージ

スクリーンショット 2020-10-28 19.50.40.png

作業の流れ

1.VCNの構成
2.ネットワーク・セキュリティ・グループの作成
3.MySQL DBシステムの作成
4.Computeインスタンス(APサーバ)の作成
5.パブリックIPの作成
6.ComputeインスタンスへのパブリックIPの割り当て
7.MySQLクライアントのインストールと設定
8.Node.jsのインストールと設定
9.firewalldの設定
10.SELinuxの設定
11.MySQL DBシステムの接続情報の確認
12.アプリケーションで使用するDBの準備
13.Node.jsアプリケーションの作成
14.Node.jsアプリケーションの動作確認

1.VCNの構成

こちらの記事を参考に、仮想クラウド・ネットワークを構成します。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

ここでは、以下の理由からMySQL DBシステムを独立したプライベート・サブネットに配置します。
・MySQL DBシステムはプライベート・エンドポイントのみを持つ。
・MySQL DBシステムにはネットワーク・セキュリティ・グループを適用できない。

そのため、参考記事のネットワーク構成に対して、以下の部分を変更します。

・Subnet2のセキュリティ・リスト(Security List for Subnet2)
APサーバを配置するサブネット(Subnet1:10.0.1.0/24)からのみ、MySQLへの接続で使用するTCP 3306、33060へのアクセスを許可します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 
 → 「仮想クラウドネットワークの詳細」 → 「セキュリティ・リスト」

「セキュリティ・リストの作成」をクリック
 ・ 名前:Security List for Subnet2
 ・コンパートメントに作成:「Compartment1」を選択
  ・「+追加のイングレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・ソース・タイプ:「CIDR」を選択
   ・ソースCIDR:10.0.1.0/24
   ・IPプロトコル:「TCP」を選択
   ・ソース・ポート範囲:入力しない
   ・宛先ポート範囲:3306
  ・「+追加のイングレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・ソース・タイプ:「CIDR」を選択
   ・ソースCIDR:10.0.1.0/24
   ・IPプロトコル:「TCP」を選択
   ・ソース・ポート範囲:入力しない
   ・宛先ポート範囲:33060
  ・「+追加のエグレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・宛先タイプ:「CIDR」を選択
   ・宛先CIDR:0.0.0.0/0
   ・IPプロトコル:「全てのプロトコル」を選択」
 ・「セキュリティ・リストの作成」をクリック

2.ネットワーク・セキュリティ・グループの作成

今回作成するNode.jsアプリケーションでTCP 8080でリクエストを受けるので、すべての場所からTCP 8080へのアクセスを許可するネットワーク・セキュリティ・グループを作成します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 → 「仮想クラウドネットワークの詳細」 → 「ネットワーク・セキュリティ・グループ」

「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for AP
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「CIDR」を選択
   ソース:0.0.0.0/0
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:8080
  説明:Security Rule for TCP 8080 **
 ・
「作成」をクリック**

3.MySQL DBシステムの作成

「コンソールメニュー」 → 「MySQL」 → 「DBシステム」

・「MySQL DBシステムの作成」をクリック

 DBシステムの基本情報情報
 ・コンパートメントの選択:「Compartment1」を選択
 ・DBシステムの名前の指定:MySQL1
 ・可用性ドメインの選択:任意の可用性ドメインを選択
 ・フォルト・ドメインの選択:任意のフォルト・ドメインを選択
 ・シェイプの選択:任意のシェイプを選択
 ・データ・ストレージ・サイズ(GB):任意のサイズを入力
 ・メンテナンス・ウィンドウの開始時間:入力しない
 ・「次」をクリック

 データベースの基本情報の指定
 ・管理者資格証明の作成
  ・ユーザー名:admin
  ・パスワード:Demo#1Demo#1
  ・パスワードの確認:Demo#1Demo#1
 ・ネットワーク情報の指定
  ・仮想クラウドネットワーク:「VCN1」を選択
  ・サブネット:「Subnet2」を選択
  ・ホスト名:mysql1
  ・MySQLポート:3306(デフォルト)
  ・MYSQL Xプロトコル・ポート:33060(デフォルト)
  ・「次」をクリック

 DBシステム・バックアップの基本情報の指定
 ・バックアップの構成
  ・自動バックアップの有効化:チェックをオン(デフォルト)
  ・バックアップ保持期間:7(デフォルト)
  ・バックアップ・ウィンドウの開始時間:デフォルト・バックアップ・ウィンドウ(デフォルト)
 
  ・「作成」をクリック

4.Computeインスタンス(APサーバ)の作成

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

・「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:「Compartment1」を選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスを割り当てないでください」を選択
 
 ・SSHキーの追加
  ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ・ブートボリュームの構成
  ・全てデフォルトのまま

 ・「拡張オプションの表示」をクリック
  ・「管理」タブ
   ・全てデフォルトのまま
  ・「ネットワーキング」タブ
   ・プライベートIPアドレス:10.0.1.100
   ・ホスト名:ap1
   ・起動オプション:デフォルトのまま
  ・「イメージ」タブ
   ・デフォルトのまま
  ・「配置」タブ
   ・デフォルトのまま
「作成」をクリック

5.パブリックIPの作成

「コンソールメニュー」 → 「ネットワーキング」 → 「IP Management」

「パブリックIPアドレスの予約」をクリック

 ・予約済パブリックIPアドレス名:PublicIP1
 ・コンパートメントに作成:「Compartment1」を選択
 ・IPアドレスのソース:「Oracle」を選択

 ・「パブリックIPアドレスの予約」をクリック

6.ComputeインスタンスへのパブリックIPの割り当て

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」 → 「インスタンスの詳細」

・リソース欄の「アタッチされたVNIC」をクリック
VNIC名(AP1)をクリック
・リソース欄の「IPアドレス」をクリック
IPアドレスの欄の「:」をクリックし、「編集」をクリック
 ・パブリックIPタイプ:「予約済パブリックIP」を選択
 ・「既存の予約済パブリックIPの選択」を選択
 ・RESERVED IP ADDRESS:「PublicIP1」を選択
「更新」をクリック

7.MySQLクライアントのインストールと設定

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

タイムゾーンとロケールを設定します。

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

yumコマンドでMySQLクライアントをインストールします。

sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-community-client

8.Node.jsのインストールと設定

yumコマンドでNode.jsインストールをインストールします。

sudo yum install -y oracle-release-el7 oracle-nodejs-release-el7
sudo yum install -y --disablerepo=ol7_developer_EPEL nodejs

npmコマンドで使用するNode.jsモジュール(expressフレームワーク、ejs)をインストールします。

sudo npm install -g --save express-generator
sudo npm install -g --save ejs

9.firewalldの設定

firewall-cmdコマンドでfirewalldにTCP8080の通信を許可する設定を追加します。

sudo firewall-cmd --add-port 8080/tcp --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public

10.SELinuxの設定

SELinuxの設定を変更します。

sudo setenforce 0

再起動後にSELinuxが有効にならないように設定ファイルを変更します。

sudo vi /etc/selinux/config
/etc/selinux/config
SELINUX=enforcing

の部分を以下のように変更して保存します。

/etc/selinux/config
SELINUX=permissive

11.MySQL DBシステムの接続情報の確認

「コンソール」 → 「MySQL DBシステム」 → 「MySQL DBシステム」

リソース欄の「エンドポイント」をクリックし、MySQL DBシステムのエンドポイント(ホスト、ポート)を確認します。
スクリーンショット 2020-10-28 21.00.05.png

12.アプリケーションで使用するDBの準備

DB接続情報を含む、MySQLクライアントの設定ファイルを作成します。

vi /home/opc/.my.cnf
/home/opc/.my.cnf
[client]
user=admin
password="Demo#1Demo#1"
host="mysql1.subnet2.vcn1.oraclevcn.com"

mysqlコマンドででMySQLに接続に接続します。

mysql

アプリケーションで使用するDBを作成します。

mysql> CREATE DATABASE testdb;

アプリケーションで使用するDBユーザを作成します。

mysql> CREATE USER 'test' IDENTIFIED BY 'Demo#1Demo#1';

アプリケーションで使用するDBユーザに権限を付与します。

mysql> GRANT ALL ON testdb.* TO 'test';

アプリケーションで使用するDBに接続します。

mysql> USE testdb

アプリケーションで使用するテーブルを作成します。

mysql> CREATE TABLE dept (
    -> deptno INT ,
    -> dname VARCHAR(14),
    -> loc VARCHAR(13) ,
    -> PRIMARY KEY  (deptno) 
    -> );

アプリケーションで使用するテーブルにデータを挿入します。

mysql> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
mysql> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
mysql> INSERT INTO dept VALUES (30,'SALES','CHICAGO');
mysql> INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
mysql> COMMIT;

アプリケーションで使用するテーブルのデータを確認します。

mysql> SELECT * FROM dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

mysqlコマンドを終了します。

mysql> exit

13.Node.jsアプリケーションの作成

今回はexpressフレームワークを使用してNode.jsアプリケーションを作成します。

opcユーザのホームディレクトリ直下に、expressコマンドでNode.jsアプリケーション環境を作成します。

cd /home/opc
express --view=ejs app

アプリケーション環境のディレクトリに移動し、npmコマンドで依存関係のあるモジュールをインストールします。

cd app
npm install

npmコマンドでMySQLにアクセスするために使用する@mysql/xdevapiモジュールをインストールします。

npm install --save @mysql/xdevapi 

app.jsを編集します。

vi /home/opc/app/app.js

末尾に以下の内容を追加します。

/home/opc/app/app.js
app.listen(8080);

routes/index.jsを編集します。

vi /home/opc/app/routes/index.js

以下の内容に書き換えます。

/home/opc/app/routes/index.js
var express = require('express');
var mysqlx = require('@mysql/xdevapi');
var router = express.Router();
var os = require('os');

mysqlx
  .getSession({
   user: 'test',
   password: 'Demo#1Demo#1',
   host: 'mysql1.subnet2.vcn1.oraclevcn.com',
   port: '33060'
   })
    .then(function (session) {
      var db = session.getSchema('testdb');
      var myTable = db.getTable('dept');
      var rows =  myTable
         .select()
         .execute()
         .then(res => {
           dept = res.fetchAll();
           hostname = os.hostname();
           console.log(dept);
           console.log(hostname);
         });
      router.get('/', function(req, res, next) {
        res.render('index',{dept: dept, hostname: hostname});
      });
    })
    .catch(function (err) {
       console.log('error: ' + err.stack);
            return;
    });

module.exports = router;

views/index.ejsを編集します。

vi /home/opc/app/views/index.ejs

以下の内容に書き換えます。

/home/opc/app/views/index.ejs
<html>
<head>
<meta charset="UTF-8">
<title>Node.js to MySQL DS Connection Test</title>
</head>
<body>
<table border='1'>
<caption>DEPT Table</caption>
<tr><th>Dept No.</th><th>Dept Name</th><th>Location</th></tr>
  <% dept.forEach(function(deptItem) { %>
    <tr>
    <td><%- deptItem[0] %></td>
    <td><%- deptItem[1] %></td>
    <td><%- deptItem[2] %></td>
    </tr>
  <% }); %>
</table><br>
Response from <%- hostname %>
</body>
</html>

14.Node.jsアプリケーションの動作確認

nodeコマンドでアプリケーションを実行します。

cd /home/opc/app
node app.js

PCのブラウザからアクセスして、アプリケーションの動作を確認します。

http://<AP1のグローバルIP>:8080

スクリーンショット 2020-10-28 21.21.13.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[OCI] Computeインスタンス上にNode.jsのWebアプリケーション環境を構成して、MySQL Database ServiceのDBシステムにアクセスしてみた

はじめに

Computeインスタンス上に構成したNode.jsのWebアプリケーションから、MySQL Database ServiceのDBシステムにアクセスしてみた時の手順です。
(2020年10月現在)

構築イメージ

スクリーンショット 2020-10-28 19.50.40.png

作業の流れ

1.VCNの構成
2.ネットワーク・セキュリティ・グループの作成
3.MySQL DBシステムの作成
4.Computeインスタンス(APサーバ)の作成
5.パブリックIPの作成
6.ComputeインスタンスへのパブリックIPの割り当て
7.MySQLクライアントのインストールと設定
8.Node.jsのインストールと設定
9.firewalldの設定
10.SELinuxの設定
11.MySQL DBシステムの接続情報の確認
12.アプリケーションで使用するDBの準備
13.Node.jsアプリケーションの作成
14.Node.jsアプリケーションの動作確認

1.VCNの構成

こちらの記事を参考に、仮想クラウド・ネットワークを構成します。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

ここでは、以下の理由からMySQL DBシステムを独立したプライベート・サブネットに配置します。
・MySQL DBシステムはプライベート・エンドポイントのみを持つ。
・MySQL DBシステムにはネットワーク・セキュリティ・グループを適用できない。

そのため、参考記事のネットワーク構成に対して、以下の部分を変更します。

・Subnet2のセキュリティ・リスト(Security List for Subnet2)
APサーバを配置するサブネット(Subnet1:10.0.1.0/24)からのみ、MySQLへの接続で使用するTCP 3306、33060へのアクセスを許可します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 
 → 「仮想クラウドネットワークの詳細」 → 「セキュリティ・リスト」

「セキュリティ・リストの作成」をクリック
 ・ 名前:Security List for Subnet2
 ・コンパートメントに作成:「Compartment1」を選択
  ・「+追加のイングレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・ソース・タイプ:「CIDR」を選択
   ・ソースCIDR:10.0.1.0/24
   ・IPプロトコル:「TCP」を選択
   ・ソース・ポート範囲:入力しない
   ・宛先ポート範囲:3306
  ・「+追加のイングレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・ソース・タイプ:「CIDR」を選択
   ・ソースCIDR:10.0.1.0/24
   ・IPプロトコル:「TCP」を選択
   ・ソース・ポート範囲:入力しない
   ・宛先ポート範囲:33060
  ・「+追加のエグレス・ルール」をクリック
   ・ステートレス:チェックをオフ(デフォルト)
   ・宛先タイプ:「CIDR」を選択
   ・宛先CIDR:0.0.0.0/0
   ・IPプロトコル:「全てのプロトコル」を選択」
 ・「セキュリティ・リストの作成」をクリック

2.ネットワーク・セキュリティ・グループの作成

今回作成するNode.jsアプリケーションでTCP 8080でリクエストを受けるので、すべての場所からTCP 8080へのアクセスを許可するネットワーク・セキュリティ・グループを作成します。

「コンソールメニュー」 → 「ネットワーキング」 → 「仮想クラウド・ネットワーク」 → 「仮想クラウドネットワークの詳細」 → 「ネットワーク・セキュリティ・グループ」

「ネットワーク・セキュリティ・グループの作成」をクリック
 ・名前:Network Security Group for AP
 ・コンパートメントに作成:「Compartment1」を選択
 ・「次」をクリック
 ・セキュリティ・ルールの追加
  ルール
   ステートレス:チェックをオフ(デフォルト)
   方向:「イングレス」を選択
   ソースタイプ:「CIDR」を選択
   ソース:0.0.0.0/0
   IPプロトコル:「TCP」を選択
   ソース・ポート範囲:デフォルトのまま(入力しない)
   宛先ポート範囲:8080
  説明:Security Rule for TCP 8080 **
 ・
「作成」をクリック**

3.MySQL DBシステムの作成

「コンソールメニュー」 → 「MySQL」 → 「DBシステム」

・「MySQL DBシステムの作成」をクリック

 DBシステムの基本情報情報
 ・コンパートメントの選択:「Compartment1」を選択
 ・DBシステムの名前の指定:MySQL1
 ・可用性ドメインの選択:任意の可用性ドメインを選択
 ・フォルト・ドメインの選択:任意のフォルト・ドメインを選択
 ・シェイプの選択:任意のシェイプを選択
 ・データ・ストレージ・サイズ(GB):任意のサイズを入力
 ・メンテナンス・ウィンドウの開始時間:入力しない
 ・「次」をクリック

 データベースの基本情報の指定
 ・管理者資格証明の作成
  ・ユーザー名:admin
  ・パスワード:Demo#1Demo#1
  ・パスワードの確認:Demo#1Demo#1
 ・ネットワーク情報の指定
  ・仮想クラウドネットワーク:「VCN1」を選択
  ・サブネット:「Subnet2」を選択
  ・ホスト名:mysql1
  ・MySQLポート:3306(デフォルト)
  ・MYSQL Xプロトコル・ポート:33060(デフォルト)
  ・「次」をクリック

 DBシステム・バックアップの基本情報の指定
 ・バックアップの構成
  ・自動バックアップの有効化:チェックをオン(デフォルト)
  ・バックアップ保持期間:7(デフォルト)
  ・バックアップ・ウィンドウの開始時間:デフォルト・バックアップ・ウィンドウ(デフォルト)
 
  ・「作成」をクリック

4.Computeインスタンス(APサーバ)の作成

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

・「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:「Compartment1」を選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスを割り当てないでください」を選択
 
 ・SSHキーの追加
  ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ・ブートボリュームの構成
  ・全てデフォルトのまま

 ・「拡張オプションの表示」をクリック
  ・「管理」タブ
   ・全てデフォルトのまま
  ・「ネットワーキング」タブ
   ・プライベートIPアドレス:10.0.1.100
   ・ホスト名:ap1
   ・起動オプション:デフォルトのまま
  ・「イメージ」タブ
   ・デフォルトのまま
  ・「配置」タブ
   ・デフォルトのまま
「作成」をクリック

5.パブリックIPの作成

「コンソールメニュー」 → 「ネットワーキング」 → 「IP Management」

「パブリックIPアドレスの予約」をクリック

 ・予約済パブリックIPアドレス名:PublicIP1
 ・コンパートメントに作成:「Compartment1」を選択
 ・IPアドレスのソース:「Oracle」を選択

 ・「パブリックIPアドレスの予約」をクリック

6.ComputeインスタンスへのパブリックIPの割り当て

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」 → 「インスタンスの詳細」

・リソース欄の「アタッチされたVNIC」をクリック
VNIC名(AP1)をクリック
・リソース欄の「IPアドレス」をクリック
IPアドレスの欄の「:」をクリックし、「編集」をクリック
 ・パブリックIPタイプ:「予約済パブリックIP」を選択
 ・「既存の予約済パブリックIPの選択」を選択
 ・RESERVED IP ADDRESS:「PublicIP1」を選択
「更新」をクリック

7.MySQLクライアントのインストールと設定

秘密鍵を使って、SSHクライアントからComputeインスタンス(AP1)にopcユーザでログインします。

タイムゾーンとロケールを設定します。

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

yumコマンドでMySQLクライアントをインストールします。

sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-community-client

8.Node.jsのインストールと設定

yumコマンドでNode.jsインストールをインストールします。

sudo yum install -y oracle-release-el7 oracle-nodejs-release-el7
sudo yum install -y --disablerepo=ol7_developer_EPEL nodejs

npmコマンドで使用するNode.jsモジュール(expressフレームワーク、ejs)をインストールします。

sudo npm install -g --save express-generator
sudo npm install -g --save ejs

9.firewalldの設定

firewall-cmdコマンドでfirewalldにTCP8080の通信を許可する設定を追加します。

sudo firewall-cmd --add-port 8080/tcp --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public

10.SELinuxの設定

SELinuxの設定を変更します。

sudo setenforce 0

再起動後にSELinuxが有効にならないように設定ファイルを変更します。

sudo vi /etc/selinux/config
/etc/selinux/config
SELINUX=enforcing

の部分を以下のように変更して保存します。

/etc/selinux/config
SELINUX=permissive

11.MySQL DBシステムの接続情報の確認

「コンソール」 → 「MySQL DBシステム」 → 「MySQL DBシステム」

リソース欄の「エンドポイント」をクリックし、MySQL DBシステムのエンドポイント(ホスト、ポート)を確認します。
スクリーンショット 2020-10-28 21.00.05.png

12.アプリケーションで使用するDBの準備

DB接続情報を含む、MySQLクライアントの設定ファイルを作成します。

vi /home/opc/.my.cnf
/home/opc/.my.cnf
[client]
user=admin
password="Demo#1Demo#1"
host="mysql1.subnet2.vcn1.oraclevcn.com"

mysqlコマンドででMySQLに接続に接続します。

mysql

アプリケーションで使用するDBを作成します。

mysql> CREATE DATABASE testdb;

アプリケーションで使用するDBユーザを作成します。

mysql> CREATE USER 'test' IDENTIFIED BY 'Demo#1Demo#1';

アプリケーションで使用するDBユーザに権限を付与します。

mysql> GRANT ALL ON testdb.* TO 'test';

アプリケーションで使用するDBに接続します。

mysql> USE testdb

アプリケーションで使用するテーブルを作成します。

mysql> CREATE TABLE dept (
    -> deptno INT ,
    -> dname VARCHAR(14),
    -> loc VARCHAR(13) ,
    -> PRIMARY KEY  (deptno) 
    -> );

アプリケーションで使用するテーブルにデータを挿入します。

mysql> INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
mysql> INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
mysql> INSERT INTO dept VALUES (30,'SALES','CHICAGO');
mysql> INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
mysql> COMMIT;

アプリケーションで使用するテーブルのデータを確認します。

mysql> SELECT * FROM dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

mysqlコマンドを終了します。

mysql> exit

13.Node.jsアプリケーションの作成

今回はexpressフレームワークを使用してNode.jsアプリケーションを作成します。

opcユーザのホームディレクトリ直下に、expressコマンドでNode.jsアプリケーション環境を作成します。

cd /home/opc
express --view=ejs app

アプリケーション環境のディレクトリに移動し、npmコマンドで依存関係のあるモジュールをインストールします。

cd app
npm install

npmコマンドでMySQLにアクセスするために使用する@mysql/xdevapiモジュールをインストールします。

npm install --save @mysql/xdevapi 

app.jsを編集します。

vi /home/opc/app/app.js

末尾に以下の内容を追加します。

/home/opc/app/app.js
app.listen(8080);

routes/index.jsを編集します。

vi /home/opc/app/routes/index.js

以下の内容に書き換えます。

/home/opc/app/routes/index.js
var express = require('express');
var mysqlx = require('@mysql/xdevapi');
var router = express.Router();
var os = require('os');

mysqlx
  .getSession({
   user: 'test',
   password: 'Demo#1Demo#1',
   host: 'mysql1.subnet2.vcn1.oraclevcn.com',
   port: '33060'
   })
    .then(function (session) {
      var db = session.getSchema('testdb');
      var myTable = db.getTable('dept');
      var rows =  myTable
         .select()
         .execute()
         .then(res => {
           dept = res.fetchAll();
           hostname = os.hostname();
           console.log(dept);
           console.log(hostname);
         });
      router.get('/', function(req, res, next) {
        res.render('index',{dept: dept, hostname: hostname});
      });
    })
    .catch(function (err) {
       console.log('error: ' + err.stack);
            return;
    });

module.exports = router;

views/index.ejsを編集します。

vi /home/opc/app/views/index.ejs

以下の内容に書き換えます。

/home/opc/app/views/index.ejs
<html>
<head>
<meta charset="UTF-8">
<title>Node.js to MySQL DS Connection Test</title>
</head>
<body>
<table border='1'>
<caption>DEPT Table</caption>
<tr><th>Dept No.</th><th>Dept Name</th><th>Location</th></tr>
  <% dept.forEach(function(deptItem) { %>
    <tr>
    <td><%- deptItem[0] %></td>
    <td><%- deptItem[1] %></td>
    <td><%- deptItem[2] %></td>
    </tr>
  <% }); %>
</table><br>
Response from <%- hostname %>
</body>
</html>

14.Node.jsアプリケーションの動作確認

nodeコマンドでアプリケーションを実行します。

cd /home/opc/app
node app.js

PCのブラウザからアクセスして、アプリケーションの動作を確認します。

http://<AP1のグローバルIP>:8080

スクリーンショット 2020-10-28 21.21.13.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本番のEXPLAINを可視化する

前段

開発環境や、ステージングなどで本番に近いデータがある場合は、下記ツールで可視化できます。

しかし、本番にしかないデータ量でのEXPLAINを可視化するにはどうすればよいでしょうか?

pt-visual-explain を使う

pt-query-digest で有名な Percona Toolkit には

というものがあります。
前段のツールのように、色分けされた可視化はできませんが、tree構造で可視化できます。

table形式

$ cat explain_table.txt
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | customers | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    5 |   100.00 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

$ pt-visual-explain explain_table.txt                                                                                                            
Filter with WHERE
+- Table scan
   rows           5
   +- Table
      table          customers

:pencil: explainは Create Index の例からお借りしました

vertical形式

$ cat explain_vertical.txt
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: d
         type: ALL
possible_keys: PRIMARY
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 9
        Extra: Parent of 4 pushed join@1
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: de
         type: ref
possible_keys: PRIMARY,emp_no,dept_no
          key: dept_no
      key_len: 4
          ref: employees.d.dept_no
         rows: 5305
        Extra: Child of 'd' in pushed join@1
*************************** 3. row ***************************
           id: 1
  select_type: SIMPLE
        table: e
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: employees.de.emp_no
         rows: 1
        Extra: Child of 'de' in pushed join@1
*************************** 4. row ***************************
           id: 1
  select_type: SIMPLE
        table: t
         type: ref
possible_keys: PRIMARY,emp_no
          key: emp_no
      key_len: 4
          ref: employees.de.emp_no
         rows: 19
        Extra: Child of 'e' in pushed join@1
4 rows in set (0.00 sec)

$ pt-visual-explain explain_vertical.txt                                                                                                                                                                                                                                                                                                      
JOIN
+- Bookmark lookup
|  +- Table
|  |  table          t
|  |  possible_keys  PRIMARY,emp_no
|  +- Index lookup
|     key            t->emp_no
|     possible_keys  PRIMARY,emp_no
|     key_len        4
|     ref            employees.de.emp_no
|     rows           19
+- JOIN
   +- Bookmark lookup
   |  +- Table
   |  |  table          e
   |  |  possible_keys  PRIMARY
   |  +- Unique index lookup
   |     key            e->PRIMARY
   |     possible_keys  PRIMARY
   |     key_len        4
   |     ref            employees.de.emp_no
   |     rows           1
   +- JOIN
      +- Bookmark lookup
      |  +- Table
      |  |  table          de
      |  |  possible_keys  PRIMARY,emp_no,dept_no
      |  +- Index lookup
      |     key            de->dept_no
      |     possible_keys  PRIMARY,emp_no,dept_no
      |     key_len        4
      |     ref            employees.d.dept_no
      |     rows           5305
      +- Table scan
         rows           9
         +- Table
            table          d
            possible_keys  PRIMARY

:pencil: explainは sysvar_ndb_join_pushdown の例からお借りしました

EXPLAIN FORMAT=JSON

pt-visual-explain 3.2.1 では対応していませんでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pmm(Percona Monitoring and Management )インストール手順

はじめに

QNAPの Container Station を利用して pmm(Percona Monitoring and Management ) をセットアップしてみたので,その作業記録です(簡潔すぎてすみません).

serverの設定

  • 監視する側
    • インターフェースはGrafanaなので,馴染みのある方も多いと思います
  • 今回はQNAPの Container Station にて構築したため省略(数クリックでDockerコンテナを起動でき大変便利)

clientの設定

  • 監視される側
  • mysqlサーバはすでに導入済みであることを前提とする

pmm2-clientをyumインストール

sudo yum install pmm2-client

serverとの接続確認

<user>:<password> の箇所はデフォルトでは admin:admin

sudo pmm-admin config --server-insecure-tls --server-url=https://<user>:<password>@<server ip address>:443

もし以下のようなエラーが出る場合は,上記コマンドに --force を付加して再度実行してみてください.

Checking local pmm-agent status...
pmm-agent is running.
Registering pmm-agent on PMM Server...
Failed to register pmm-agent on PMM Server: Node with name "xxxxxx" already exists..

モニタリング設定投入

以下,いずれかの方法でモニタリング設定を投入する.

方法その1:MySQLユーザ名,パスワードを指定しての設定

# syntax
sudo pmm-admin add mysql --username=<mysql user> --password=<mysql user password> --query-source=<query source> <service name>
# example
sudo pmm-admin add mysql --username=john --password=johnpass --query-source=perfschema mysqlserver001

方法その2:ソケットを指定しての設定

Adding MySQL Service Monitoring

Note
It is also possible to add MySQL instance using UNIX socket with use of a special --socket flag followed with the path to a socket without username, password and network type:

sudo pmm-admin add mysql --socket=/var/path/to/mysql/socket

ポート許可

clientのインバウンドに以下ポートを許可する必要がある.
環境に応じて,firewallなりセキュリティグループなりにポート許可設定を追加.

The following ports must be open to enable communication between the PMM Server and PMM clients.

42000
For PMM to collect genenal system metrics.
42002
For PMM to collect MySQL server metrics.
42003
For PMM to collect MongoDB server metrics.
42004
For PMM to collect ProxySQL server metrics.
42005
For PMM to collect PostgreSQL server metrics.
Also PMM Server should keep ports 80 or 443 ports open for computers where PMM Client is installed to access the PMM web interface and the QAN agent.

コンソール接続

ブラウザより https://<server ip address>:443 にアクセス
初回ログイン時,パスワードの変更を求められる.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysql 完全アンインストール+再インストール

アンインストール

Mysqlの停止

mysql.server stop

HomebrewからMysqlのアンインストール

brew uninstall mysql

不要ファイルの削除

sudo rm -rf /usr/local/var/mysql
sudo rm -rf /usr/local/etc/my.cnf

インストール

HomebrewでMysqlのインストール

brew install mysql@5.6
// mysql5.6の場合

動いているか確認

mysql.server status

最後に

念のためPCを再起動

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MyCLI: MySQL、MariaDB、Perconaの自動補完機能を備えたコマンドラインインターフェース

MyCLIは、MySQL、MariaDB、Percona用の使いやすいコマンドラインインターフェイス(CLI)で、自動補完機能や構文ハイライト機能で開発のスピードアップを支援します。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

前提条件

MyCLIツールはPythonをベースにしているので、PIP経由でインストールする必要があります。pipとpython開発ライブラリがインストールされていることを確認してください。ECSインスタンスを正しくセットアップしていれば、以下の3行のコードを実行してMyCLIをインストールするだけです。

yum install python-pip
yum -y install python-devel
pip install mycli

MyCLIの詳細

MyCLI の使い方がわからない場合は、以下に示すように、いつでも —help コマンドを実行して、その様々なオプションについて知ることができます。

$ mycli --help
 Usage: mycli [OPTIONS] [DATABASE]

 Options:
   -h, --host TEXT               Host address of the database.
   -P, --port INTEGER            Port number to use for connection. Honors
                                 $MYSQL_TCP_PORT
   -u, --user TEXT               User name to connect to the database.
   -S, --socket TEXT             The socket file to use for connection.
   -p, --password TEXT           Password to connect to the database
   --pass TEXT                   Password to connect to the database
   --ssl-ca PATH                 CA file in PEM format
   --ssl-capath TEXT             CA directory
   --ssl-cert PATH               X509 cert in PEM format
   --ssl-key PATH                X509 key in PEM format
   --ssl-cipher TEXT             SSL cipher to use
   --ssl-verify-server-cert      Verify server's "Common Name" in its cert
                                 against hostname used when connecting. This
                                 option is disabled by default
   -v, --version                 Version of mycli.
   -D, --database TEXT           Database to use.
   -R, --prompt TEXT             Prompt format (Default: "\t \u@\h:\d> ")
   -l, --logfile FILENAME        Log every query and its results to a file.
   --defaults-group-suffix TEXT  Read config group with the specified suffix.
   --defaults-file PATH          Only read default options from the given file
   --myclirc PATH                Location of myclirc file.
   --auto-vertical-output        Automatically switch to vertical output mode
                                 if the result is wider than the terminal
                                 width.
   -t, --table                   Display batch output in table format.
   --csv                         Display batch output in CSV format.
   --warn / --no-warn            Warn before running a destructive query.
   --local-infile BOOLEAN        Enable/disable LOAD DATA LOCAL INFILE.
   --login-path TEXT             Read this path from the login file.
   -e, --execute TEXT            Execute query to the database.
   --help                        Show this message and exit.

使用例

以下のコマンドを実行して、ApsaraDB for RDSインスタンス上でMyCLIを実行するだけです。

$ mycli ®Ch{RDS DNS Alias} ®Cu{RDS User Name} -p{RDS Password}

接続されると、デフォルトのCLIを使用するのと同じようにMyCLIを使用することができます。

続きを読むには

また、Alibaba Cloudでは、Alibaba Cloud CLI上で独自のコマンド自動補完機能を提供しています。詳細については、https://www.alibabacloud.com/help/doc-detail/29998.html をご覧ください。

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HerokuにデプロイしたMysqlのロールバック方法をメモ

はじめに

RubyOnRailsでアプリを作成しデプロイ。
Heroku上でマイグレーションファイルを実行後のベータデースのリセットをメモしておく。


● エラーメッセージから環境変数を確認

コマンドを実行

$ heroku run rake db:migrate:reset!

エラー画面
エラー画面


● 確認した環境変数 DISABLE_DATABASE_ENVIRONMENT_CHECK=1 を付与して、データベースをdropする

コマンドを実行

$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop

 実行後
スクリーンショット 2020-10-28 16.09.06.png


● 再生成

コマンドを実行

 データベースの生成
$ heroku run rails db:create

 マイグレーションを実行
$ heroku run rake db:migrate

参考

[Rails5] heroku db:resetからmigrateまで
Rails5のproductionでrake db:dropはできない、普通には

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

herokuにデプロイしたMysqlのロールバック方法をメモ

はじめに

RubyOnRailsでアプリを作成しデプロイ。
heroku上でマイグレーションファイルを実行後のベータデースのリセットをメモしておく。


● エラーメッセージから環境変数を確認

コマンドを実行

$ heroku run rake db:migrate:reset!

エラー画面
エラー画面


● 確認した環境変数 DISABLE_DATABASE_ENVIRONMENT_CHECK=1 を付与して、データベースをdropする

コマンドを実行

$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop

 実行後
スクリーンショット 2020-10-28 16.09.06.png


● 再生成

コマンドを実行

 データベースの生成
$ heroku run rails db:create

 マイグレーションを実行
$ heroku run rake db:migrate

参考

[Rails5] heroku db:resetからmigrateまで
Rails5のproductionでrake db:dropはできない、普通には

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[OCI] 定期的にMySQL DBシステムのmysqldumpを取得して、他のリージョンのObject Storageに保管してみた

はじめに

OCIのMySQL DSには便利な自動バックアップの機能がありますが、バックアップを別のリージョンに転送することができません。(2020年10月現在)

そこで、ComputeインスタンスにMySQL ClientとOCI CLIをインストールし、自動的に毎日mysqldumpで取得したダンプファイルを別のリージョンのObject Storageに転送する簡易DR構成を構築してみました。

作業の流れ

  1. オブジェクト・ライフサイクル・ポリシーを利用するためのポリシー設定
  2. オブジェクト・ストレージ・バケットの作成
  3. ライフサイクル・ポリシーの作成
  4. Computeインスタンスの作成
  5. タイムゾーン/ロケールの設定
  6. MySQLクライアントのインストールと設定
  7. OCI CLIのインストールと設定
  8. シェルスクリプトの作成
  9. crontabへの登録

1. オブジェクト・ライフサイクル・ポリシーを利用するためのポリシー設定

オブジェクト・ライフサイクル・ポリシーを利用するためには、以下のようなポリシーをrootコンパートメントに割り当てる必要があります。

Allow service objectstorage-<region_identifier> to manage object-family in compartment <compartment_name>
Allow service objectstorage-<region_identifier> to manage object-family in tenancy

例えば、Osakaリージョンでテナント全体でオブジェクト・ライフサイクル・ポリシーを利用する場合は、以下のようなポリシー・ステートメントになります。

Allow service objectstorage-ap-osaka-1 to manage object-family in tenancy

以下の手順で、ポリシーをrootコンパートメントに割り当てます。

「コンソールメニュー」 → 「アイデンディディ」 → 「ポリシー」

ポリシーの作成」をクリック
 名前:ObjectStoragePolicy
 説明:Policy for Object Life Cycle Policy in Osaka
 コンパートメント:root(ルート)
 ポリシービルダー:
  「カスタマイズ」をクリック
   以下を入力
   Allow service objectstorage-ap-osaka-1 to manage object-family in tenancy
 「作成」をクリック

2. オブジェクト・ストレージ・バケットの作成

以下の手順で、dumpファイル保存用のバケットを作成します。
「コンソールメニュー」 → 「オブジェクト・ストレージ」 → 「オブジェクト・ストレージ」

「バケットの作成」をクリック
 バケット名:MySQLdump
 ストレージ層:「標準」を選択
 オブジェクト・イベントの出力:チェックをオン
 暗号化:「ORACLE管理キーを使用した暗号化」を選択
 「バケットの作成」をクリック

3. ライフサイクル・ポリシーの作成

以下の手順で、オブジェクト・ストレージ・バケットのライフサイクル・ポリシーを作成します。
こちらの例では、バケット内に作成されたオブジェクトは8日後にアーカイブされ、30日後に削除されるポリシーを設定しています。

「コンソールメニュー」 → 「オブジェクト・ストレージ」 → 「オブジェクト・ストレージ」

バケット名「MySQLdump」をクリック
左下のリソース欄の「ライフサイクル・ポリシー・ルール」をクリック
「ルールの作成」をクリック
 名前:Archive Rule for Backup
 ターゲット:「オブジェクト」を選択
 ライフサイクル・アクション:「アーカイブ」を選択
 日数:8
 「作成」をクリック
「ルールの作成」をクリック
 名前:Delete Rule for Backup
 ターゲット:「オブジェクト」を選択
 ライフサイクル・アクション:「削除」を選択
 日数:30
 「作成」をクリック

4. Computeインスタンスの作成

こちらの記事のネットワーク構成を前提とします。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:任意のコンパートメントを選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスの割当て」を選択
 
 SSHキーの追加
 ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ブートボリュームの構成
 ・全てデフォルトのまま

「作成」をクリック

5. タイムゾーン/ロケールの設定

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

6. MySQLクライアントのインストールと設定

sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-community-client

MySQLクライアントの設定(接続情報)ファイルを作成します。
ここでは、MySQL DBシステムの接続情報が以下であると仮定します。

ホスト名 mysql1.subnet2.vcn1.oraclevcn.com
ユーザ名 admin
パスワード Demo#1Demo#1
vi .my.cnf
/home/opc/.my.cnf
[client]
user=admin
password="Demo#1Demo#1"
host="mysql1.subnet2.vcn1.oraclevcn.com"

7. OCI CLIのインストールと設定

こちらのドキュメントを参考に、 OCI CLIをインストールします。
Oracle Cloud Infrastructure ドキュメント:コマンドライン・インタフェース クイックスタート

8. cron実行用のシェルスクリプトの作成

mysqldumpの出力先となるdumpディレクトリを作成し、そこにcron実行用のシェルスクリプトを作成します。

mkdir dump
vi /home/opc/dump/daily_dump.sh
/home/opc/dump/daily_dump.sh
echo 
echo "START:"`date`
FILE="/home/opc/dump/dump"`date "+%Y%m%d_%H%M%S"`".dmp"

echo "Filename:"$FILE
mysqldump --set-gtid-purged=OFF testdb > $FILE
echo "mysqldump to" $FILE "finished successfully."

/home/opc/bin/oci os object put -ns nrhnlrqdttaw -bn MySQLdump --file $FILE
echo $FILE "was uploaded to Object Storage successfully."

rm $FILE
echo $FILE "was deleted successfully."
echo "END:"`date`

作成したシェルスクリプトのパーミッションを変更します。

chmod +x /home/opc/dump/daily_dump.sh

作成したシェルスクリプトをcrontabに登録します。
以下の例では、5分毎にスクリプトを実行します。

crontab -e
crontab
*/5 * * * * /home/opc/dump/daily_dump.sh >> /tmp/daily_dump.log 2>&1

正常実行時のログファイルの内容は以下のようになります。

/tmp/daily_dump.log
START:Tue Oct 27 23:10:01 JST 2020
Filename:/home/opc/dump/dump20201027_231001.dmp
mysqldump to /home/opc/dump/dump20201027_231001.dmp finished successfully.
Uploading object
{
  "etag": "a2a48c0f-e93f-4a8d-9f5b-aa5f472b8b7a",
  "last-modified": "Tue, 27 Oct 2020 14:10:08 GMT",
  "opc-content-md5": "rYFQSKQvKu1a9S55Zt4+Sg=="
}
/home/opc/dump/dump20201027_231001.dmp was uploaded to Object Storage successfully.
/home/opc/dump/dump20201027_231001.dmp was deleted successfully.
END:Tue Oct 27 23:10:09 JST 2020

START:Tue Oct 27 23:15:01 JST 2020
Filename:/home/opc/dump/dump20201027_231501.dmp
mysqldump to /home/opc/dump/dump20201027_231501.dmp finished successfully.
Uploading object
{
  "etag": "44389267-d657-4bf2-97c2-c137f723115b",
  "last-modified": "Tue, 27 Oct 2020 14:15:08 GMT",
  "opc-content-md5": "G5aa3pt9yybDKfDnveyy2w=="
}
/home/opc/dump/dump20201027_231501.dmp was uploaded to Object Storage successfully.
/home/opc/dump/dump20201027_231501.dmp was deleted successfully.
END:Tue Oct 27 23:15:09 JST 2020
                                .
                                .
                                .

コンソールから正常にdmpファイルがオブジェクト・ストレージに保存されていることを確認します。
スクリーンショット 2020-10-27 23.41.38.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

定期的にMySQL DBシステムのmysqldumpを取得して、他のリージョンのObject Storageに保管してみた

はじめに

OCIのMySQL DSには便利な自動バックアップの機能がありますが、バックアップを別のリージョンに転送することができません。(2020年10月現在)

そこで、ComputeインスタンスにMySQL ClientとOCI CLIをインストールし、自動的に毎日mysqldumpで取得したダンプファイルを別のリージョンのObject Storageに転送する簡易DR構成を構築してみました。

作業の流れ

  1. オブジェクト・ライフサイクル・ポリシーを利用するためのポリシー設定
  2. オブジェクト・ストレージ・バケットの作成
  3. ライフサイクル・ポリシーの作成
  4. Computeインスタンスの作成
  5. タイムゾーン/ロケールの設定
  6. MySQLクライアントのインストールと設定
  7. OCI CLIのインストールと設定
  8. シェルスクリプトの作成
  9. crontabへの登録

1. オブジェクト・ライフサイクル・ポリシーを利用するためのポリシー設定

オブジェクト・ライフサイクル・ポリシーを利用するためには、以下のようなポリシーをrootコンパートメントに割り当てる必要があります。

Allow service objectstorage-<region_identifier> to manage object-family in compartment <compartment_name>
Allow service objectstorage-<region_identifier> to manage object-family in tenancy

例えば、Osakaリージョンでテナント全体でオブジェクト・ライフサイクル・ポリシーを利用する場合は、以下のようなポリシー・ステートメントになります。

Allow service objectstorage-ap-osaka-1 to manage object-family in tenancy

以下の手順で、ポリシーをrootコンパートメントに割り当てます。

「コンソールメニュー」 → 「アイデンディディ」 → 「ポリシー」

ポリシーの作成」をクリック
 名前:ObjectStoragePolicy
 説明:Policy for Object Life Cycle Policy in Osaka
 コンパートメント:root(ルート)
 ポリシービルダー:
  「カスタマイズ」をクリック
   以下を入力
   Allow service objectstorage-ap-osaka-1 to manage object-family in tenancy
 「作成」をクリック

2. オブジェクト・ストレージ・バケットの作成

以下の手順で、dumpファイル保存用のバケットを作成します。
「コンソールメニュー」 → 「オブジェクト・ストレージ」 → 「オブジェクト・ストレージ」

「バケットの作成」をクリック
 バケット名:MySQLdump
 ストレージ層:「標準」を選択
 オブジェクト・イベントの出力:チェックをオン
 暗号化:「ORACLE管理キーを使用した暗号化」を選択
 「バケットの作成」をクリック

3. ライフサイクル・ポリシーの作成

以下の手順で、オブジェクト・ストレージ・バケットのライフサイクル・ポリシーを作成します。
こちらの例では、バケット内に作成されたオブジェクトは8日後にアーカイブされ、30日後に削除されるポリシーを設定しています。

「コンソールメニュー」 → 「オブジェクト・ストレージ」 → 「オブジェクト・ストレージ」

バケット名「MySQLdump」をクリック
左下のリソース欄の「ライフサイクル・ポリシー・ルール」をクリック
「ルールの作成」をクリック
 名前:Archive Rule for Backup
 ターゲット:「オブジェクト」を選択
 ライフサイクル・アクション:「アーカイブ」を選択
 日数:8
 「作成」をクリック
「ルールの作成」をクリック
 名前:Delete Rule for Backup
 ターゲット:「オブジェクト」を選択
 ライフサイクル・アクション:「削除」を選択
 日数:30
 「作成」をクリック

4. Computeインスタンスの作成

こちらの記事のネットワーク構成を前提とします。

OCIのネットワークを構成する際に手戻りの少ない手順を考えてみる(初心者向け)

「コンソールメニュー」 → 「コンピュート」 → 「インスタンス」

「インスタンスの作成」をクリック
 ・名前:AP1
 ・コンパートメントに作成:任意のコンパートメントを選択

 ・配置とハードウェアの構成
  ・可用性ドメイン:任意のADを選択
  ・イメージ:「Oracle Linux 7.8」を選択
  ・シェイプ:任意のシェイプを選択

 ・ネットワーキングの構成 
  ・ネットワーク:「既存の仮想クラウド・ネットワークを選択」を選択し、「VCN1」を選択
  ・サブネット:「既存のサブネット」を選択し、「Subnet 1」を選択
  ・ネットワーク・セキュリティ・グループを使用してトラフィックを制御:チェックをオン
  ・ネットワーク・セキュリティ・グループ:「Network Security Group for AP」を選択
  ・パブリックIPアドレス:「パブリックIPアドレスの割当て」を選択
 
 SSHキーの追加
 ・「公開キー・ファイルの選択」を選択し、「または場所を参照します」をクリックして公開キー・ファイルをアップロードします
 
 ブートボリュームの構成
 ・全てデフォルトのまま

「作成」をクリック

5. タイムゾーン/ロケールの設定

sudo timedatectl set-timezone Asia/Tokyo
sudo localectl set-locale LANG=ja_JP.utf8

6. MySQLクライアントのインストールと設定

sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-community-client

MySQLクライアントの設定(接続情報)ファイルを作成します。
ここでは、MySQL DBシステムの接続情報が以下であると仮定します。

ホスト名 mysql1.subnet2.vcn1.oraclevcn.com
ユーザ名 admin
パスワード Demo#1Demo#1
vi .my.cnf
/home/opc/.my.cnf
[client]
user=admin
password="Demo#1Demo#1"
host="mysql1.subnet2.vcn1.oraclevcn.com"

7. OCI CLIのインストールと設定

こちらのドキュメントを参考に、 OCI CLIをインストールします。
Oracle Cloud Infrastructure ドキュメント:コマンドライン・インタフェース クイックスタート

8. cron実行用のシェルスクリプトの作成

mysqldumpの出力先となるdumpディレクトリを作成し、そこにcron実行用のシェルスクリプトを作成します。

mkdir dump
vi /home/opc/dump/daily_dump.sh
/home/opc/dump/daily_dump.sh
echo 
echo "START:"`date`
FILE="/home/opc/dump/dump"`date "+%Y%m%d_%H%M%S"`".dmp"

echo "Filename:"$FILE
mysqldump --set-gtid-purged=OFF testdb > $FILE
echo "mysqldump to" $FILE "finished successfully."

/home/opc/bin/oci os object put -ns nrhnlrqdttaw -bn MySQLdump --file $FILE
echo $FILE "was uploaded to Object Storage successfully."

rm $FILE
echo $FILE "was deleted successfully."
echo "END:"`date`

作成したシェルスクリプトのパーミッションを変更します。

chmod +x /home/opc/dump/daily_dump.sh

作成したシェルスクリプトをcrontabに登録します。
以下の例では、5分毎にスクリプトを実行します。

crontab -e
crontab
*/5 * * * * /home/opc/dump/daily_dump.sh >> /tmp/daily_dump.log 2>&1

正常実行時のログファイルの内容は以下のようになります。

/tmp/daily_dump.log
START:Tue Oct 27 23:10:01 JST 2020
Filename:/home/opc/dump/dump20201027_231001.dmp
mysqldump to /home/opc/dump/dump20201027_231001.dmp finished successfully.
Uploading object
{
  "etag": "a2a48c0f-e93f-4a8d-9f5b-aa5f472b8b7a",
  "last-modified": "Tue, 27 Oct 2020 14:10:08 GMT",
  "opc-content-md5": "rYFQSKQvKu1a9S55Zt4+Sg=="
}
/home/opc/dump/dump20201027_231001.dmp was uploaded to Object Storage successfully.
/home/opc/dump/dump20201027_231001.dmp was deleted successfully.
END:Tue Oct 27 23:10:09 JST 2020

START:Tue Oct 27 23:15:01 JST 2020
Filename:/home/opc/dump/dump20201027_231501.dmp
mysqldump to /home/opc/dump/dump20201027_231501.dmp finished successfully.
Uploading object
{
  "etag": "44389267-d657-4bf2-97c2-c137f723115b",
  "last-modified": "Tue, 27 Oct 2020 14:15:08 GMT",
  "opc-content-md5": "G5aa3pt9yybDKfDnveyy2w=="
}
/home/opc/dump/dump20201027_231501.dmp was uploaded to Object Storage successfully.
/home/opc/dump/dump20201027_231501.dmp was deleted successfully.
END:Tue Oct 27 23:15:09 JST 2020
                                .
                                .
                                .

コンソールから正常にdmpファイルがオブジェクト・ストレージに保存されていることを確認します。
スクリーンショット 2020-10-27 23.41.38.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのtime_zoneを設定する方法

Windows以外はいつかやった時に書く・・・つもり

Windows

本当はsystem_time_zoneをJSTに設定したかったがわからず・・・

設定前

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone |        |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set, 1 warning (0.03 sec)

方法

  1. MySQL :: Time zone description tablesを表示する
  2. [POSIX standard]のzipファイルをダウンロードする
    • 今回ダウンロードしたのはtimezone_2020b_posix_sql.zip
  3. zipファイルを任意の場所に解凍する
  4. zipから出てきたtimezone_posix.sqlをデータベースmysqlに対して実行する
    • うっかり自分が使っているDBを指定するとERROR 1146 (42S02) at line 1: Table 'mydb.time_zone' doesn't existと怒られる
  5. my.iniの[mysqld]default-time-zone = 'Asia/Tokyo'を追記する
  6. MySQLを再起動する
# zipファイルを任意の場所に解凍する
$ unzip /c/Users/ponsuke/Downloads/timezone_2020b_posix_sql.zip -d /c/apps/mysql-8.0.19-winx64/
Archive:  /c/Users/ponsuke/Downloads/timezone_2020b_posix_sql.zip
   creating: /c/apps/mysql-8.0.19-winx64/timezone_2020b_posix_sql/
  inflating: /c/apps/mysql-8.0.19-winx64/timezone_2020b_posix_sql/timezone_posix.sql

# zipから出てきたtimezone_posix.sqlを実行する(GitBashは対話できないのでパスワードを直指定)
$ mysql -u root -D mysql -ppassword < /c/apps/mysql-8.0.19-winx64/timezone_2020b_posix_sql/timezone_posix.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

# my.iniに追記する
$ cat /c/apps/mysql-8.0.19-winx64/my.ini
[mysqld]
default-time-zone = 'Asia/Tokyo'
# ...省略...

# MySQLを再起動する
$ sc stop MySQL80
SERVICE_NAME: MySQL80
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x1
        WAIT_HINT          : 0x5265c00
$ sc start MySQL80
SERVICE_NAME: MySQL80
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x3
        WAIT_HINT          : 0x3a98
        PID                : 7756
        FLAGS              :

# GitBashを使っているのでwinptyをつけて接続
$ winpty mysql -u ponsuke -D mydb -p
Enter password: *******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone |            |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set, 1 warning (0.01 sec)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSを使ったWordPress環境構築(冗長構成)

事前準備

前回からの続きです。

構成はWebサーバ1台、DBサーバ1台です。

環境

環境 IP
Webサーバ 10.0.1.1
DBサーバ 10.0.2.1

DBサーバの操作

  • DBサーバに接続する。

直接SSHで接続するか、Webサーバを経由して接続してください。

MySQL Yum RepositoryからMySQL5.7をインストールする。

  • Yumリポジトリの情報のインストール
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  • MySQL8.0リポジトリを無効にし、MySQL5.7リポジトリを有効にする
$ sudo yum-config-manager --disable mysql80-community
$ sudo yum-config-manager --enable mysql57-community
#適用されているか確認
$ cat /etc/yum.repos.d/mysql-community.repo
  • MySQLのインストール・起動
$ sudo yum install -y mysql-community-server
$ sudo systemctl start mysqld
  • MySQLの初期パスワードの確認
$ sudo cat /var/log/mysqld.log | grep root@localhost
[Note] A temporary password is generated for root@localhost: 12桁の文字列
  • MySQLのパスワード変更
$ mysqladmin -uroot -p password
Enter password:古いパスワード
New password:新しいパスワード
Confirm new password:新しいパスワード
#Warnigがでても変更はできています
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

Passwordのポリシーについて

  • WordPress用のDB・ユーザーを作成する
$ mysql -uroot -p
Enter password:設定したパスワード
#WordPress用のユーザー作成
mysql> CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpressユーザーのパスワード';
#WordPress用のDB作成
mysql> CREATE DATABASE `wordpress`;
#DB権限を作成したユーザーに付与
mysql> GRANT ALL PRIVILEGES ON `wordpress`.* TO "wordpress"@"10.0.1.1";
#設定反映
mysql> FLUSH PRIVILEGES;
mysql> EXIT;

※サブネットマスクはワイルドカード方式を用いることで指定できる。'10.0.1.%'

Webサーバの操作

  • WordPressのDBダンプを取得
$ sudo systemctl start mysqld
$ mysqldump -uroot -p wordpress | gzip > wordpress.dump.gz
Enter password:
#WebサーバのMySQLの停止
$ sudo systemctl stop mysqld
#ダンプをリストア
$ zcat wordpress.dump.gz | mysql -h 10.0.2.1 -uwordpress -p wordpress
  • WordPressの設定変更
# WordPessの設定を変更
$ sudo vim wordpress/wp-config.php
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'wordpress' );
/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'wordpress' );
/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'パスワード' );
/** MySQL のホスト名 */
define( 'DB_HOST', '10.0.2.1' );

# サービスリロード
$ sudo systemctl reload httpd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者がWordPress環境構築してみた(冗長構成)

事前準備

前回からの続きです。

構成はWebサーバ1台、DBサーバ1台です。

環境

環境 IP
Webサーバ 10.0.1.1
DBサーバ 10.0.2.1

DBサーバの操作

  • DBサーバに接続する。

直接SSHで接続するか、Webサーバを経由して接続してください。

MySQL Yum RepositoryからMySQL5.7をインストールする。

  • Yumリポジトリの情報のインストール
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  • MySQL8.0リポジトリを無効にし、MySQL5.7リポジトリを有効にする
$ sudo yum-config-manager --disable mysql80-community
$ sudo yum-config-manager --enable mysql57-community
#適用されているか確認
$ cat /etc/yum.repos.d/mysql-community.repo
  • MySQLのインストール・起動
$ sudo yum install -y mysql-community-server
$ sudo systemctl start mysqld
  • MySQLの初期パスワードの確認
$ sudo cat /var/log/mysqld.log | grep root@localhost
[Note] A temporary password is generated for root@localhost: 12桁の文字列
  • MySQLのパスワード変更
$ mysqladmin -uroot -p password
Enter password:古いパスワード
New password:新しいパスワード
Confirm new password:新しいパスワード
#Warnigがでても変更はできています
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

Passwordのポリシーについて

  • WordPress用のDB・ユーザーを作成する
$ mysql -uroot -p
Enter password:設定したパスワード
#WordPress用のユーザー作成
mysql> CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpressユーザーのパスワード';
#WordPress用のDB作成
mysql> CREATE DATABASE `wordpress`;
#DB権限を作成したユーザーに付与
mysql> GRANT ALL PRIVILEGES ON `wordpress`.* TO "wordpress"@"10.0.1.1";
#設定反映
mysql> FLUSH PRIVILEGES;
mysql> EXIT;

※サブネットマスクはワイルドカード方式を用いることで指定できる。'10.0.1.%'

Webサーバの操作

  • WordPressのDBダンプを取得
$ sudo systemctl start mysqld
$ mysqldump -uroot -p wordpress | gzip > wordpress.dump.gz
Enter password:
#WebサーバのMySQLの停止
$ sudo systemctl stop mysqld
#ダンプをリストア
$ zcat wordpress.dump.gz | mysql -h 10.0.2.1 -uwordpress -p wordpress
  • WordPressの設定変更
# WordPessの設定を変更
$ sudo vim wordpress/wp-config.php
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'wordpress' );
/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'wordpress' );
/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'パスワード' );
/** MySQL のホスト名 */
define( 'DB_HOST', '10.0.2.1' );

# サービスリロード
$ sudo systemctl reload httpd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL】外部キー制約を一時的に無効にする

目的

開発環境やテスト環境でデータの操作上、
外部キー制約を一時的にしたい

方法

無効にする

SET FOREIGN_KEY_CHECKS = 0

有効に戻す

SET FOREIGN_KEY_CHECKS = 1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む