2020年5月19日火曜日

データベースの検索

show databases like 'キーワード%';

各DBサイズを調べる(一覧表示)

DBサイズ一覧:
=============
SELECT 
    table_schema, sum(data_length) /1024/1024 AS mb 
FROM 
    information_schema.tables  
GROUP BY 
    table_schema 
ORDER BY       
    sum(data_length+index_length) DESC;
=============


テーブルサイズ一覧:
===========
SELECT  
    table_name, engine, table_rows AS tbl_rows,
    avg_row_length AS rlen,  
    floor((data_length+index_length)/1024/1024) AS allmb,  #総容量
    floor((data_length)/1024/1024) AS dmb,  #データ容量
    floor((index_length)/1024/1024) AS imb   #インデックス容量
FROM 
    information_schema.tables  
WHERE
    table_schema=database()  
ORDER BY
    (data_length+index_length) DESC; 
===========

現在の接続しているスレッド数


1)現在の接続しているスレッド数を確認する
mysql> show status like 'Threads_connected';


2)select文で確認
SELECT * FROM information_schema.PROCESSLIST;

プロセスのKill

1)SequelPro/Workbenchで対象のDBに接続を行う

2)以下の手順で、プロセスの確認及びkillを行う。
========
①現在のプロセスの状態を確認する。
SHOW PROCESSLIST;

②処理に60秒以上かかっているプロセスを確認する(rdsadminは除外で確認する。)
SELECT * FROM information_schema.PROCESSLIST WHERE time >= 60 and user != 'rdsadmin';

③以下のコマンドで、削除対象のプロセスを指定する。
KILL [Id];

④再度のプロセスの状態を確認して、対処のプロセスが削除されていること。
SHOW PROCESSLIST;
======


■接続時(Sequel Pro)に以下のエラー表示が出力される。
== error 内容 ==
blocked because of many connection errors; unblock with 'mysqladmin flush-hosts


blocked because of many connection errors; unblock with 'mysqladmin flush-hosts


発生原因:
DB接続に失敗すると発生するエラー


障害内容:
①管理画面からアクセスを行うとDB接続が出来ない状態になる。
->API間のアクセスについては、クレームが出てない。
②接続時(Sequel Pro)に以下のエラー表示が出力される。
== error 内容 ==
blocked because of many connection errors; unblock with 'mysqladmin flush-hosts


調査経緯:
ネット上の情報を収集限り、暫定的な解決方法が多いので
原因特定になる鍵が見つからない状態
それと、error.logに過去ログが残っていないので特定ができない状態。


日中の場合:
対象のDBを接続されている方からロックのエラーが表示を確認されたら
Slackで即時報告してもらう。
業務外
API/RDSのCPU使用率が100%になったら、RDS->EC2再起動を行う。
- EC2を別途設けることも考えたが、作成時間を考慮した場合再起動したほうが早そう。
- ネット情報ですが、再起動すれば解除されるようです。
解消策がない場合
- スナップショットからのリカバリを実施する


対処方法(暫定的な):
①対象のDBにて、以下のコマンドを投入する。
FLUSH HOSTS;

②RDSのパラメータのmax_error_count(10 ->xxxxx)の値を変更する
  ->65535まで変更可能。

上記、②については、発生するトリガーが不明なのと信憑製が分からないので
の対処になるかと思う。

Dockerfileの記述方法について

1)FROM
①ベースイメージの設定
②publicのリポジトリを指定して取得するのが楽(例えば、ruby:2.3.3みたいなイメージ)
③複数回指定し複数イメージ作成することが可能だが、その場合は直前の内容までが一つのimageとしてcommitされる
④digestはdocker images --digestsで表示可能
FROM  
FROM : 
FROM @

例:
FROM nginx:1.15.0-alpine


2)MAINTAINER
作成者情報を設定
MAINTAINER

3)ADD
①新しいファイル、フォルダをコピーする。(圧縮されているファイルは展開される)
例:
ADD

4)COPY
②新しいファイルをフォルダコピーする。(圧縮されているファイルは展開されない)
COPY 
 ->主にxxxx.confファイル系をローカル上からコンテナに送り込むのに便利

5)ENV
③環境変数の設定
ENV  
ENV =

6)RUN
①対象のイメージにインストールされているコマンドを実行できる(useradd,yum,apt-get等はよく使う)
RUN 
例:
RUN pip install -r requirements.txt

7)EXPOSE
①特定のポートを解放する。
EXPOSE 

例:
EXPOSE 9000

8)CMD
①実行するコンテナーのデフォルト値を設定するのが一番の目的
②同じDockerfile内で使用できるのは一回のみ
③ENTRYPOINTに対して引数を設定することも可能

例1:
CMD echo "This is a test." | wc -
例2:
CMD ["/usr/bin/wc", "--help"]


9)WORKDIR
①ワークディレクトリを設定する
②同じDockerfile内に複数回指定可能
③ENVで登録したパスを利用してもよい

例:
/var/www/laravel

Dockerの環境変数について

以下のような環境変数は、アプリの導入時に必要な物なので
AWS側の環境変数には記載しない。


環境変数について:
1)環境変数に変わらない場合
AWSに書く必要はない

2)環境変数によって変わる場合
ステージング・本番環境によって異なるものは、AWS側に記述すること。

3).envファイルなど
中身を開発側に確認が必要!!(OSに関する情報などを意識すること)

メモ:
これらの設定(環境変数)は、composer(PHPのパッケージマネージャ)に必要なものと思われます。
これは、Dockerとして動作する際に必要とし、StagingでもProductionでもコンテナ上は
変わらない設定だと思うので、Dockerfileに書く。


AWSのサービス設定としての環境変数保存について:
Develop、Statging、Productionでそれぞれ異なる設定が必要になるような物
->例えば、データソースのエンドポイント、何かの接続ユーザ名やそのCredentialといったものです。

Dockerコマンド

[タグなしコンテナの削除]
docker system prune


[イメージ全削除]
docker rmi $(docker images -q)


[強制削除]
docker rmi -f  [イメージID]


[起動中のコンテナの全停止]
docker ps -q | xargs docker stop | xargs docker rm


[docker 一括削除]
docker rm -f docker ps -a -q


[alpine linuxログイン方法]
docker exec -it コンテナID /bin/ash


[dockerコピー]
(docker > ホスト間)
①以下の方法でコピーを行う。(ローカル環境で実施)
sudo docker cp [docker ID]:[対象のフォルダ] /<—コピー先

例:
sudo docker cp 28631a7dd6e0:yii-1.1.21/testdrive /

Failed to get D-Bus connection: Operation not permittedの対処策

1)systemctlコマンドを行うと以下の様なエラーが出て実行できない。
systemctl
==== Error内容 =======
Failed to get D-Bus connection: Operation not permitted


2)—privilegedを付けて、コンテナを立ち上げてから入ることでsystemctlが使えるようになる。
docker run --privileged --name centos -d centos /sbin/init


3)実施にログインして試す。
docker exec -ti centos bash

docker-composeファイルの記述方法について

Docker compose とは:
以下の様な、個別のコンテナを一括で作成管理をするツールになる。
(個別で、Dokcerfileの実行が不要なので楽)


簡単なイメージ:
project_folder
|-------docker-compose <-----ここにnginxとphpのコンテナ実行に関する記述を記載
|-------nginx
| |----Dockerfile
|-------php
|----Dockerfile


Docker composeの記述方法について:
[image]
イメージを取得
例:
image: ubuntu

[build]
Dockerfile のあるディレクトリのパスを指定する。
例:
build: /path/to/build/dir

[command]
コマンドを使用時に記載
例:
command: bundle exec thin -p 3000

[links]
①コンテナを他のサービスにリンクします。
サービス名とリンク・エイリアス(サービス:エイリアス)を指定できるだけでなく
又は、サービス名(エイリアスとしても使われます)でも指定できます。

例:
links:
- db
- db:database
- redis


②エイリアス名を記述すると、コンテナ内の/etc/hosts の中にサービス名が
追加されるようだ。
例:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis


Dockerの環境変数について:
参照先:

①name_PORT
全ての URL です。
例:DB_PORT=tcp://172.17.0.5:5432

②name_PORT_num_protocol
全ての URL です。
例:DB_PORT_5432_TCP=tcp://172.17.0.5:5432

③name_PORT_num_protocol_ADDR
コンテナの IP アドレスです。
例:DB_PORT_5432_TCP_ADDR=172.17.0.5

④name_PORT_num_protocol_PORT
公開するポート番号です。
例:DB_PORT_5432_TCP_PORT=5432

⑤name_PORT_num_protocol_PROTO
プロトコルです(TCP か UDP)。
例:DB_PORT_5432_TCP_PROTO=tcp

⑥name_NAME
コンテナの完全修飾名です。
例:DB_1_NAME=/myapp_web_1/myapp_db_1

php-fpm x nginx(CentOS6)

nginx と php-fpmの設定を記載する。

各種バージョン:
php-fpm:5.4
php: 5.4.16
nginx:1.16.1
cantos:6.x

document root:
/var/www/html

default.confの記載内容について:
vi /etc/nginx/conf.d/default.conf


php-fpmの記載内容について:
vi /etc/php-fpm.d/www.conf


最後に、サービスの再起動は忘れずに!!
①systemctl restart nginx
②systemctl restart php-fpm

ローカルLLMでコーディングさせるポイント

 簡単な指示で、依頼するとコンテキストオーバーで記憶喪失になって コードの内容が一致しないことが起こるので、work.mdみたいな作業メモを取らせたるのがよい 途中から、別スレッドに再実施する場合でも、work.mdが引き継ぎとして 参照して実施してくれるのがポイント