MySQL5.7 を CentOS 7 にインストール

MySQL Yum リポジトリを使用して MySQL を Linux にインストールするを参考にしながら、CentOS7に Yum を利用してMySQLのインストールを行う。

1.Yum リポジトリ

1.1 Yum リポジトリの取得

Download MySQL Yum Repository から、該当のリポジトリを探す。

mysql_inst01

RHEL と CentOS のメジャーバージョンは対応しているので、RHEL7のリポジトリを選択し、ダウンロードボタン。

遷移先の画面で、ログインを求められるが、左下に、直接ダウンロードするURLがリンク(No thanks just start my download) されているので、URLをコピーする。

mysql_inst02

インストール先のサーバーに接続し適当なディレクトリに上記URLからwgetでリポジトリRPMをダウンロード

$ wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

1.2 Yumリポジトリのインストール

$ su
パスワード:
# yum localinstall mysql57-community-release-el7-9.noarch.rpm

mysql_inst03

MySQL Yum リポジトリのすべてのサブリポジトリを表示し、どれが有効でどれが無効かを確認。デフォルトで最新GAが有効になっている。

# yum repolist all | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community         有効:    30
mysql-connectors-community-source MySQL Connectors Community - Sourc 無効
mysql-tools-community/x86_64      MySQL Tools Community              有効:    40
mysql-tools-community-source      MySQL Tools Community - Source     無効
mysql-tools-preview/x86_64        MySQL Tools Preview                無効
mysql-tools-preview-source        MySQL Tools Preview - Source       無効
mysql55-community/x86_64          MySQL 5.5 Community Server         無効
mysql55-community-source          MySQL 5.5 Community Server - Sourc 無効
mysql56-community/x86_64          MySQL 5.6 Community Server         無効
mysql56-community-source          MySQL 5.6 Community Server - Sourc 無効
mysql57-community/x86_64          MySQL 5.7 Community Server         有効:   164
mysql57-community-source          MySQL 5.7 Community Server - Sourc 無効
mysql80-community/x86_64          MySQL 8.0 Community Server         無効
mysql80-community-source          MySQL 8.0 Community Server - Sourc 無効
  • 最新の GA シリーズの最新のリリースをインストールする場合は、構成は不要
  • 最新の GA シリーズ以外の特定のシリーズの最新リリースをインストールするには、インストールコマンドを実行する前に、最新の GA シリーズのサブリポジトリを無効にし、その特定のシリーズのサブリポジトリを有効にする。
  • 使用しているプラットフォームで yum-config-manager がサポートされている場合は、次のコマンドを発行することで実行可能
$ sudo yum-config-manager --disable mysql56-community
$ sudo yum-config-manager --enable mysql57-community-dmr

2.MySQLのインストール

2.1 Yumでインストール

# yum install mysql-community-server

2.2 MySQLの起動

# systemctl start  mysqld.service

2.3 接続

2.3.1 root パスワード

root パスワードが分からない。5.6 のときは、/root/.mysql_secret に出力されていたが、存在していない。

[root@localhost ~]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

MySQL 5.7をインストールしたら出てきたERROR 1045 (28000)の対処法

ログに出力されているようだ。パスワード部分をコピーしてログイン

[root@localhost ~]# cat /var/log/mysqld.log | grep 'password is generated'
2017-01-02T14:16:14.031813Z 1 [Note] A temporary password is generated for root@localhost: eOq=?fDX5kyy

mysql5.7でパスワードを変更する

2.3.2 セキュリティ設定

mysql_secure_installation を実行しセキュリティーポリシーを設定

[root@localhost ~]# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) :

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

 ... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

 ... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

2.3.3 CentOS ファイアーウォール設定

外部から接続できないので、3306ポートを開ける

# firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
# firewall-cmd --reload
success

2.3.4 別PCの MySQL Workbench から接続

接続先ホストが許可されていない。

mysql_inst04

アクセス拒否のトラブルシュート

アクセス制御、ステージ 1: 接続の検証

ID チェックは、user テーブルの 3 つのスコープカラム (HostUserPassword) を使用して実施されます。サーバーは、一部の user テーブル行の Host および User カラムがクライアントホスト名およびユーザー名と一致し、その行に指定されているパスワードがクライアントから提供された場合のみ、接続を受け入れます。許容可能な Hostおよび User 値についてのルールは、セクション6.2.3「アカウント名の指定」にあります。

任意のホストから接続できる、app ユーザー を作成。

パスワードが必須かつ、英大文字、小文字、数字、記号を含むパスワードしか受け付けてくれない。

mysql> use mysql
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> create user 'app'@'%';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> create user 'app'@'%' identified by '*****';
Query OK, 0 rows affected (0.02 sec)
mysql> select user,host from user;
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| app       | %         |
| mysql.sys | localhost |
| root      | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

接続成功

mysql_inst05

2.3.5 ユーザーに権限付与

管理者権限を付与して、Workbenchから接続

mysql> grant all privileges on *.* to 'root'@'%' identified by '********' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql_inst06

Django REST framework の動作確認

AnacondaとSpyderでDjango REST 開発環境を整える で開発環境を作成したので、動作確認 まで行う。

1.インストール

1.1 必要パッケージのインストール

 AnacondaとSpyderでDjango REST 開発環境を整える を参照。

pip install djangorestframework
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support

1.2 設定の記述

settings.py

INSTALLED_APPS = [
        :
    'rest_framework',
]

urls.py

API情報を閲覧可能にしたい場合、ログイン/アウトの機能が必要になるだろう。その場合、ルート urls.py ファイルに以下を追加する。

urlpatterns = [
              :
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

URLパスを指定するときには、'rest_framework.urls’  と一緒に、namespace=‘rest_framework’  を含めなければならないが、Django1.9以降では、REST frameworkがこれをセットするため省略可能。

2.簡単な例

プロジェクトのユーザーを読み書きできる、簡単なモデルベースのAPIを作成する。

2.1 設定

REST framework API のためのグローバル設定はすべて、REST_FRAMEWORK に保持される。settings.py モジュールに以下を追記する。

settings.py

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

2.2 Djangoプロジェクトの準備

http://djangoproject.jp/doc/ja/1.0/ref/django-admin.html

データベースを作成し、スーパーユーザーを登録する。

AnacondaとSpyderでDjango REST 開発環境を整える でしたように、Anacondaの環境から、ターミナルを起動する。

manage.py の HELP を 確認 python manage.py –help

(C:\Programs\Anaconda3\envs\webapp) C:\Users\piroto\Documents\Spyder\WebApp\restsample>python manage.py --help

Type 'manage.py help ' for help on a specific subcommand.

Available subcommands:

[auth]
    changepassword
    createsuperuser

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver

[sessions]
    clearsessions

[staticfiles]
    collectstatic
    findstatic
    runserver

データベースの作成

settings.pyの記述に従い、データベースを作成する。デフォルトのままsqlite を利用する

python manage.py migrate

https://docs.djangoproject.com/en/1.10/intro/tutorial02/

(C:\Programs\Anaconda3\envs\webapp) C:\Users\piroto\Documents\Spyder\WebApp\restsample>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

adminユーザーを作成

python manage.py createsuperuser

(C:\Programs\Anaconda3\envs\webapp) C:\Users\piroto\Documents\Spyder\WebApp\restsample>python manage.py createsuperuser
Username (leave blank to use 'piroto'):
Email address: pppiroto@gmail.com
Password:
Password (again):
Superuser created successfully.

2.2 動作確認

これで準備が整ったので、http://localhost:8000 にアクセスする。

API の説明が表示される

django_rest_api01

http://localhost:8000/users にアクセスすると、ユーザー情報が取得できる。

django_rest_api02

画面の下部には、フォームからユーザー登録を行うUIが存在する。

ただ、このUIからは、REST API を使用して登録しているわけではないようだ。

django_rest_api03

http://localhost:8080/users?format=json

でJSONが返ることを確認

django_rest_api04

Django で RESTなAPIを作成しようとするとなかなか面倒だった気がするが、REST framework なんてものがあるのを知ったので試してみる。Eclipse+PyDev環境に慣れていたのだが、Webアプリケーション以外でPythonを使うのに、Anacondaがおもしろそうなので環境構築を試みる。

「Webスクレイピング」とは、インターネットからデータを機械的に集め、必要な情報を抽出するプロセスのこと。
検索エンジンだけでは限られた情報しか集められませんが、この技術を使えば、インターネット上の膨大な情報の中から本当に必要な情報を入手できます。

1.ダウンロードとインストール

https://www.continuum.io/downloads

から、Windows用のインストラーをダウンロードしてウィザードに従いインストール。

2.仮想環境の構築

https://docs.continuum.io/anaconda/navigator-tutorial#navigator-basic-workflow

2.1 作成

Anaconda Navigator を起動し左ペインでEnvironmentを選択しCreateボタンを押下

anaconda_env01

環境名を入力、Pythonのバージョンを指定しCreate

anaconda_env02

環境が作成された。pipなど、最低限のパッケージは導入されている。

anaconda_env03

2.2 Djangoパッケージのインストール

新規に作成した環境を真ん中のペインで選択し、右側でALLを選択しキーワードにdjango を入力Applyでインストール

anaconda_env04

anaconda_env05

2.3 仮想環境の確認

環境の三角ボタンを押すと、ターミナルを起動できる。

anaconda_env06

プロンプトに、venv の環境が表示される。

pip freeze で、インストールされているパッケージを確認

anaconda_env07

3. Spyder の起動

3.1 Spyderのインストール

Anaconda Navigatorの左ペインからHomeを選択し、Applications on にて、作成した環境を選択。Spyder の Install ボタンを押下して、Spyder環境を構築する。

anaconda_env08

インストールが終わると、Lanch ボタンになるので、押下して起動する。

3.2 Djangoパッケージの確認

起動したら、Djangoパッケージが利用可能か確認してみる。import django として、F9を押下すると、その行だけ実行される。エラーがないことを確認。」

anaconda_env09

4.Django REST 環境の構築

4.1 パッケージのインストール

http://www.django-rest-framework.org/#installation

django_rest01

Anaconda Navigator のEnvironment に戻って、作成した仮想環境(venv) のターミナルを開き、pip にて対象の仮想環境に関係パッケージをインストール。

pip install djangorestframework
pip install markdown       # Markdown support for the browsable API.
pip install django-filter  # Filtering support

django_rest02

5.Django REST プロジェクトの作成

5.1 Spyderプロジェクトの作成

Spyder メニュー Projects - New Project から新規プロジェクトを作成する。

プロジェクトを作成すると、Spyder がそのディレクトリ配下をプロジェクトとして管理してくれる。

spyder_project01

5.2 DjangoプロジェクトをSpyderプロジェクトディレクトリに作成

上記で作成したSpyderプロジェクトが、Spyder メニュー 表示 - ペイン - プロジェクトエクスプローラー に表示されるので、コンテキストメニューから開くなどして、実際のパスを取得。

spyder_project02

再度、Anaconda Navigator のEnvironment に戻って、作成した仮想環境(venv) のターミナルを開き、Django プロジェクトを作成する。

>django-admin.py startproject restsample

spyder_project03

django プロジェクトが作成された。

spyder_project04

django_rest03

6.Django プロジェクトの起動

6.1 起動設定

manage.py を開いて、Spyder メニュー - 実行 - 設定 を選択。

  • 実行する設定を選択 : manage.py
  • コンソール : Pythonに特化した新規コンソールで実行
  • コマンドラインオプション : チェックONにし、runserver を入力(必要に応じポート番号)

6.3 課題としたが、プロセスの停止がSpyder上からうまくできない。コンソールに、現在のPython/IPython コンソールで実行を指定しても、IPython コンソールだとそもそもリクエストとがうまく処理されない。Python コンソールだと、リクエストは処理されるが、やはりプロセスの停止ができない。(2つプロセスができないだけこちらがましか?)

django_run01

6.2 起動およびデバッグ

実行および、デバッグ実行可能

django_run02

6.3 課題

起動したWebサーバープロセスを、Spyderから停止しようとしても停止できない。

表面上は停止状態なのだが、Webリクエストを受け付ける状態。

django_run04

プロセスを確認すると、 -u オプションありと なしとで、2つ作成されていて、Spyder上から停止しても、-u オプション付きのプロセスしか停止されない。

django_run03

-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x
         see man page for details on internal buffering relating to '-u'

うーん。まぁ最低限。