20190127のMySQLに関する記事は4件です。

(解決)mysql(mariadb)が起動しなくなった

環境

GCP (Google Cloud Platform)
Compute Engine

状態チェック

sudo systemctl status mariadb

Active: failedで起動していません(涙
Status: "MariaDB server is down" が哀愁を深めます。

● mariadb.service - MariaDB 10.1.31 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: failed (Result: exit-code) since 日 2019-01-27 20:26:45 JST; 2min 17s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 1694 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/F
AILURE)
  Process: 1587 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $?
 -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
  Process: 1583 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
 Main PID: 1694 (code=exited, status=1/FAILURE)
   Status: "MariaDB server is down"
 1月 27 20:26:43 instance-sugasaki-gom-kusanagi-02 systemd[1]: Starting MariaDB 10.1.31 database server...
 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 mysqld[1694]: 2019-01-27 20:26:45 140290193697024 [Note] /usr/sbi......
 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: mariadb.service: main process exited, code=exited, st...URE
 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: Failed to start MariaDB 10.1.31 database server.
 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: Unit mariadb.service entered failed state.
 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: mariadb.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

以下のファイルにログファイルのパスを発見
/etc/my.cnf.d/server.cnf

/etc/my.cnf.d/server.cnf
...
log-error = /var/log/mysql/mysqld.log
...

vi /var/log/mysql/mysqld.logでログファイルを確認

2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2019-01-27 19:16:22 140146316003584 [Note] InnoDB: The InnoDB memory heap is disabled
2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-01-27 19:16:22 140146316003584 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Compressed tables use zlib 1.2.7
2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Using Linux native AIO
2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Using SSE crc32 instructions
2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Initializing buffer pool, size = 384.0M

The InnoDB memory heap is disabled

と書いてあります。
はっ!

結果

GCPのVMインスタンスの料金をケチって、メモリを最小(0.6GB)に変えてたのが原因でした。
スクリーンショット 2019-01-27 20.43.44.png

  ↓

Kobito.7TpvlM.png

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

備忘録 (参考にしたサイト)

Qiitaの参考サイトはストックしてるのでここには記載しない。

ubuntuにmysqlをインストール

https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/

ubuntuでMyDNSのIP自動通知設定

https://ufuso.jp/wp/%E7%84%A1%E6%96%99%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3mydns%E3%81%AEip%E8%87%AA%E5%8B%95%E9%80%9A%E7%9F%A5%E8%A8%AD%E5%AE%9A/

ubuntuにwindows Homeからリモートデスクトップ接続

https://websiteforstudents.com/connect-to-ubuntu-16-04-17-10-18-04-desktop-via-remote-desktop-connection-rdp-with-xrdp/

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

【Go言語】DBトランザクション共通処理の具体例

初めに

Go言語でDBトランザクション処理をシンプルに書く方法を模索していた。
有力な方法が見つかったので検討の経緯とその具体例を共有する。

検討した実装パターン候補

*例コードはGORMを利用している前提。

実直に書く

tx := db.Begin()
if tx.Error != nil {
    return nil, tx.Error
}
// 何らかの処理が失敗
tx.Rollback()

// 成功時
tx.Commit()

→ もっとDRYにしたい
→ Rollback or Commitのコールを忘れそう。。

トランザクション状態を管理しつつdefer関数内で判断し必要に応じてRollbackをコール

(以下検討アイデアの雰囲気コード)

myTx, err := db.MyBegin() //← このレシーバー関数でBeginして管理トランザクション状態を開始にする
if err != nil {
    return err
}
defer myTx.MyFinish() //← トランザクション状態判定して未完了ならRollback

// 任意のDB処理
user := User {
    Name: "test name",
}
if err := myTx.tx.Create(&user).Error; err != nil {
    return err
}
if err = myTx.MyCommit(); err != nil { //← Commit成功時、管理トランザクション状態を完了にする
    return err
}
return nil

→ 少しDRYになった
→ もしMyCommit()を忘れてもトランザクションは必ず終了する
→ でも状態管理せずに済むならそちらの方がシンプルで良さそう。。

(結論)共通ラッパー処理を用意する

共通ラッパー処理を関数化するアイデアを採用した。
以下は返り値情報を受け取る場合。

// トランザクション実行し情報を受取る
func TransactAndReturnData(db *gorm.DB, txFunc func(*gorm.DB) (interface{}, error)) (data interface{}, err error) {
    tx := db.Begin()
    if tx.Error != nil {
        return nil, tx.Error
    }
    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit().Error
        }
    }()
    data, err = txFunc(tx)
    return
}

具体例

以下の様なテーブルスキーマとそれぞれのCreate関数が有ると仮定する。

type User struct {
    ID uint `gorm:"primary_key"`
    Name string
}

type Event struct {
    ID uint `gorm:"primary_key"`
    UserID uint // ← 外部キー
    Name string
}
// ユーザー作成
CreateUser(db *gorm.DB, name string) (*User, error)
// ユーザーに紐付くイベント作成
CreateEvent(db *gorm.DB, userID uint, name string) (*Event, error)

以下の様にトランザクションを扱いつつまとめて関数化出来る。

func CreateUserAndEventInTransaction(db *gorm.DB, userName, eventName string) (*User, error)  {
    data, err := TransactAndReturnData(db, func(tx *gorm.DB) (interface{}, error) {
        user, err := CreateUser(tx, userName)
        if err != nil {
            return nil, err
        }
        _, errEvent := CreateEvent(tx, user.ID, eventName)
        if errEvent != nil {
            return nil, errEvent
        }
        return user, nil
    })
    if err != nil {
        return nil, err
    }
    // 受け取りたいものをラッパー関数内で返却してキャストすれば良い
    return data.(*User), nil
}

ラッパー関数内で漏れなく各処理の結果を返す事だけを守れば安全かつシンプルにトランザクション処理が書ける様になった!

参考

golangでトランザクション管理を少し楽にするラッパー関数

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

Pythonで株価情報を取得して、MySQLに格納する

やりたいこと

データ分析用に永続データとして日本の株価情報を取得して、MySQLに格納します。
MySQLの環境は、MetabaseとMySQL環境をDockerで作るで作成したMySQLに格納します。

データソース

データソースはQuandlというサイトを利用します。
有料データもありますが、無料でも使えます。
今回はQuandlで収集されているデータの中から、東京証券取引所が提供しているデータを利用します。

環境

  • Mac OS X 10.14.2
  • Python 3.7.1
  • Quandl 3.4.5

手順

アカウント登録

APIキーを取得するためにQuandlのアカウント登録を行います。
登録は無料です。

APIキーの確認

アカウントを作成したら、右上のメニューから[ACCOUNT SETTINGS]を選択します。
プロフィール画面に遷移すると、[YOUR API KEY]にAPIが記載されているのでメモします。

データの取得

実際にデータを取得してみます
※必要なライブラリは適宜インストールしてください。

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import datetime
import quandl
import pandas as pd

# 各種設定
## 取得したい日付レンジの指定
start = datetime.datetime(2007, 1, 1)
end = datetime.datetime(2019, 1, 19)

# 取得したい会社のティックシンボルを記載します。
## 例えばの武田薬品工業の場合 TSE/4502 となります。
## https://www.quandl.com/data/TSE/4502-Takeda-Pharmaceutical-Co-Ltd-4502
company_id = 'TSE/4502'

# APIキーの設定
quandl.ApiConfig.api_key = '前の手順で確認したAPIキーをここに記載'

# データ取得
df = quandl.get(company_id ,start_date=start,end_date=end)

データが以下のように取得できていることを確認します。

>>> df.head()
              Open    High     Low   Close     Volume
Date
2007-01-04  8180.0  8210.0  8170.0  8180.0  1401400.0
2007-01-05  8180.0  8180.0  7970.0  8010.0  3020100.0
2007-01-09  8000.0  8010.0  7940.0  7950.0  2696200.0
2007-01-10  7950.0  7960.0  7760.0  7760.0  3807700.0
2007-01-11  7820.0  7890.0  7710.0  7760.0  3286800.0

MySQLにデータを格納する。

取得したデータをMySQLに格納します。
上の続きと思ってください。

import sqlalchemy as sa

## Indexが日付なので行に取り込んで、データ型を変更する。
df = df.reset_index()
df['Date'] = pd.to_datetime(df['Date'])

## 表名の指定
table_name = 'TAKEDA'

## 接続情報設定
engine = sa.create_engine('mysql+mysqlconnector://stock:stock@127.0.0.1/stock', echo=True)

# MySQLにデータを格納
df.to_sql(table_name, engine , index=False, if_exists='replace')

データの確認

MySQLにアクセスして、データを確認します。

$ mysql --host=127.0.0.1 --user=stock --password

mysql> use stock
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;
+-----------------+
| Tables_in_stock |
+-----------------+
| AAPL            |
| TAKEDA          |
+-----------------+

mysql> desc TAKEDA;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| Date   | datetime | YES  |     | NULL    |       |
| Open   | double   | YES  |     | NULL    |       |
| High   | double   | YES  |     | NULL    |       |
| Low    | double   | YES  |     | NULL    |       |
| Close  | double   | YES  |     | NULL    |       |
| Volume | double   | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
6 rows in set (0.00 sec)

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