この投稿は、主に JMP の SQL 機能の使用に関するものですが、XML、Linux、MythTV にも触れています。
SQL クエリ ビルダーのドキュメント: https://www.jmp.com/support/help/14/query-builder.shtml#
神話テレビhttps://www.mythtv.org/はオープン ソース プログラム (TANSTAAFL) で、PC のチューナー カードを使用して無線 TV 放送を録画できます (その他にも多数あります)。 Linux と MySQL/MariaDB について学び、テレビを見ないようにするのに最適な方法です。 この実装では、記録を行うバックエンド (または複数) と監視を行うフロントエンド (または複数) の 2 台のコンピューターを使用します。 SQL データベースは、何を記録するか、何を記録したかを追跡します。
https://code.mythtv.org/trac/ticket/12974#no1は、MythTV フロントエンドには表示されない、MythTV バックエンド ディスクに非常に古い、非常に大きなファイルが多数ある理由を説明しています。 フィールドが設定されてからファイルが削除されるまでの間にMythTVがクラッシュした場合、ファイルが削除されないようにするdeletependingデータベースフィールドの周りにMythTVのバグがあると言われています。
たとえば、Linux を使用すると、 lsコマンドを使用していくつかのファイルを一覧表示します。これは 3GB の例です (2019 年 12 月の時点です。3T ディスクに収まるファイルは約 2 週間分だけです。これらのファイルはずっと前になくなっているはずです。)
-rw-r--r-- 1 神話テレビ3.1G 2018年3月21日1051_20180321073000.ts
または、データベースのインポートを行った後、
JMP data table imported from database showing old, large filesJMP data table imported from database showing old, large filesJMP data table imported from database showing old, large filesJMP data table imported from database showing old, large files古い大きなファイルを表示するデータベースからインポートされた JMP データ テーブル
データベースのインポートは役に立ちそうです。関連する値を持つ列 (またはフィールド) を隣り合わせに配置し、データベース内の複数のテーブルからの情報を結合します。 これを行う手順は次のとおりです。
データベース資格証明を見つけます。
MythTV フロントエンドを実行している Linux システムでは、ファイル ~/.mythtv/config.xml があります。
<CONFIGURATION>
<LOCALHOSTNAME>my-unique-identifier-goes-here</LOCALHOSTNAME>
<DATABASE>
<PINGHOST>1</PINGHOST>
<HOST>closet.local</HOST>
<USERNAME>mythtv</USERNAME>
<PASSWORD>this is the pw</PASSWORD>
<DATABASENAME>mythconverg</DATABASENAME>
<PORT>3306</PORT>
</DATABASE>
<WAKEONLAN>
<ENABLED>0</ENABLED>
<SQLRECONNECTWAITTIME>0</SQLRECONNECTWAITTIME>
<SQLCONNECTRETRY>5</SQLCONNECTRETRY>
<COMMAND>echo 'WOLsqlServerCommand not set'</COMMAND>
</WAKEONLAN>
<UPNP>
<UDN>
<MEDIARENDERER>52d20477-fda1-4e42-9edd-5992bd0ca45f</MEDIARENDERER>
</UDN>
</UPNP>
</CONFIGURATION>
JMP のコピーが読み取れる場所にファイルをコピーし、JMP 15 で次のように開きます。
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
このような隠しテーブルを作成します
JMP data table loaded from XML file with one row and columns for UserName, Password, and DatabaseNameJMP data table loaded from XML file with one row and columns for UserName, Password, and DatabaseNameJMP data table loaded from XML file with one row and columns for UserName, Password, and DatabaseNameJMP data table loaded from XML file with one row and columns for UserName, Password, and DatabaseNameUserName、Password、および DatabaseName の 1 つの行と列を持つ XML ファイルからロードされた JMP データ テーブル
Closet.local はバックエンド ホストの名前、mythtv は mythconverg データベースにアクセスできる SQL ユーザー名、3306 は既定のポートであるため、必要ありません。
Windows の ODBC データ ソース アドミニストレータを使用して DSN を作成します。
おそらく 64 ビットのドライバーが必要であり、それらをダウンロードする必要があるかもしれません。 https://dev.mysql.com/downloads/connector/odbc/または多分https://downloads.mariadb.org/connector-odbc/+releases/ . バックエンド サーバーで実際に MariaDB を実行し、フロントエンドで MySQL コネクタを使用していると確信しています。 https://www.google.com/search?q=mysql+vs+mariadb
The Windows ODBC Data Source Administrator sets up a DSNThe Windows ODBC Data Source Administrator sets up a DSNThe Windows ODBC Data Source Administrator sets up a DSNThe Windows ODBC Data Source Administrator sets up a DSNWindows ODBC データ ソース アドミニストレータが DSN を設定します
構成を押して、いくつかのフィールドを追加します。これらはすべて、後で接続文字列を介してオーバーライドできると思います。 私のVirtualBoxとネットワークとサーバーは、サーバー名のcloset.localに満足していないため、ドット付きIPが使用されます。 ユーザーとパスワードを入力して接続をテストし、使用可能なデータベース名を確認できます。 以下のJSLはそれらをオーバーライドします。
The ODBC Connector dialog supplies some information that can be overridden laterThe ODBC Connector dialog supplies some information that can be overridden laterThe ODBC Connector dialog supplies some information that can be overridden laterThe ODBC Connector dialog supplies some information that can be overridden later[ODBC コネクタ] ダイアログは、後で上書きできるいくつかの情報を提供します。
MythTV データベースでテーブル名を発見する
からの例のおかげで@ブライアンコーコランJSLの次のビットで道を示してくれて。
https://community.jmp.com/t5/Discussions/How-do-I-get-the-list-of-the-databases-available-on-a-designated/mp/10589
// DSN=Mythtv comes from the windows ODBC Data Source Administrator applet
dt = Open Database(
"DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1],
"SHOW tables from " || dtConfig:DatabaseName[1] || ";",
"tables in " || dtConfig:DatabaseName[1]
);
その JSL は、上記の XML 構成ファイルから開かれた dtConfig JMP データ テーブルを使用して、実際のパスワードとその他の情報を取得し、DSN (ユーザー名とは無関係に mythtv とも呼ばれます) を上書きします。ブライアンの例では、SHOW DATABASES を使用しました。 この JSL は SHOW TABLES FROM mythconverg を使用して、mythconverg という名前の mythtv データベースから 80 以上のテーブルを取得します。
(SQL は複数のデータベースを持つことができ、データベースは複数のテーブルを持つことができます。 データベースは相互に対話しませんが、データベース内のテーブルには、2 つのテーブルを結合できる共通のキーがあることがよくあります。 つまり、ペットのデータベース、レシピのデータベース、MythTV のデータベースです。 MythTV データベース内には、どの番組を録画するかを説明するテーブルと、どの番組が録画されたかを説明するテーブル、および他の多くのテーブル...)
A JMP data table from Open Database(...) showing the 88 table names in the databaseA JMP data table from Open Database(...) showing the 88 table names in the databaseA JMP data table from Open Database(...) showing the 88 table names in the databaseA JMP data table from Open Database(...) showing the 88 table names in the databaseデータベース内の 88 個のテーブル名を示す Open Database(...) の JMP データ テーブル
データベースの形を理解し始めます
これを間違ってデータベースに書き込むと、データベースが破損します。 あなたは読みに行くことができますソースコードテーブルがどのように機能するかを説明するドキュメントを見つけたり、エキサイティングな質問をしたりすることもできます:明日も録画したテレビを見ることができますか? 以下はエキサイティングな方法です。
上記のデータ テーブルでデータベースのテーブル名を調べて、興味深いものがあるかどうかを確認します。 ありますが、それらが何を表しているのかはまだ明らかではありません。
two of the high lighted table names, record and recorded, look promisingtwo of the high lighted table names, record and recorded, look promisingtwo of the high lighted table names, record and recorded, look promisingtwo of the high lighted table names, record and recorded, look promisingハイライトされた 2 つのテーブル名 (record とrecorded) は有望に見えます
テーブルとその列、およびそれらのデータの一部を簡単に確認する方法を次に示します。
ファイル→データベース→OpenTable
The OpenTable dialog opens one database table into a JMP data tableThe OpenTable dialog opens one database table into a JMP data tableThe OpenTable dialog opens one database table into a JMP data tableThe OpenTable dialog opens one database table into a JMP data tableOpenTable ダイアログは、1 つのデータベース テーブルを JMP データ テーブルに開きます
このテーブルには 50 の列がありますが、飛び出すのは説明です。
The record table seems to describe what to recordThe record table seems to describe what to recordThe record table seems to describe what to recordThe record table seems to describe what to recordレコードテーブルは、何を記録するかを説明しているようです
これは、何を記録するか (または、何を記録しないか... そのルールを書きました) の説明です。これは私が必要とするテーブルではありません。
記録されたという名前のテーブルはどうですか?
The recorded table seems to be a list of programs that were recordedThe recorded table seems to be a list of programs that were recordedThe recorded table seems to be a list of programs that were recordedThe recorded table seems to be a list of programs that were recorded録画表は録画した番組の一覧のようです
録画した番組の表のようです。 これが出発点になります。
いくつかのテーブルに参加して、必要なものをすべて 1 か所にまとめます
ファイル→データベース→クエリビルダー、記録されたテーブルを選択...
Query Builder starts by choosing a single tableQuery Builder starts by choosing a single tableQuery Builder starts by choosing a single tableQuery Builder starts by choosing a single tableクエリ ビルダは、単一のテーブルを選択することから始めます
[次へ] を押すと、この驚くべき結果が得られます@エリックヒル中間ウィンドウ:
The amazing Select Tables windows can view other tables and join them to the first tableThe amazing Select Tables windows can view other tables and join them to the first tableThe amazing Select Tables windows can view other tables and join them to the first tableThe amazing Select Tables windows can view other tables and join them to the first table驚くべきテーブルの選択ウィンドウは、他のテーブルを表示し、それらを最初のテーブルに結合できます
このウィンドウは、テーブルを探索するためのものです。 Build Query はまだクリックしないでください。列を選択するウィンドウが表示されます。 その前に、このウィンドウを使用して他のテーブルに参加します。
(後でこのウィンドウに戻ることもできますが、後で最初にアクセスしたときに必要なものをすべて見つけることができるはずです...多分。)
Clicking a table shows a snapshotClicking a table shows a snapshotClicking a table shows a snapshotClicking a table shows a snapshotテーブルをクリックするとスナップショットが表示されます
これが私が使用したものです(ほとんどの場合、もう1つの変更については以下を参照してください):
Three more tables joined with the firstThree more tables joined with the firstThree more tables joined with the firstThree more tables joined with the first最初のテーブルに結合されたさらに 3 つのテーブル
データベースが記憶しているファイルサイズを取得するために、recordedfile (上記で選択) を使用しました。 ベース名が記録されたファイルと記録されたファイルに表示されるため、このデータベースは正規化されていないと思います... https://en.wikipedia.org/wiki/Database_normalization
(下部のボタンは異なります。これは、[Build Query] で [go-back-to-select-more-tables] 赤い三角形のボタンを使用してこの図を取得したためです。[OK] を押すと、[Build Query] ウィンドウに戻ります。)
ここには多くの機能があります。結合は青い円のボタンで制御でき、列内の任意のテーブルのスナップショットを表示でき、結合の結果をプレビューできます。 すべてのテーブルが一覧表示されます。 ここでパズルが解かれます。どのテーブルが必要で、それらをどのように接続するかです。 [テーブル スナップショット] タブを選択し、左側の列でテーブルを選択し、下矢印を使用して各テーブルを表示します。 多くの MythTV テーブルは空です。つまり、それらを無視できます。
保持する列を選択
[Build Query] ボタンをクリックします。 このウィンドウでは、必要な列を選択してクエリを試すことができます。
Build Query window chooses columns to keep in the JMP data tableBuild Query window chooses columns to keep in the JMP data tableBuild Query window chooses columns to keep in the JMP data tableBuild Query window chooses columns to keep in the JMP data tableBuild Query ウィンドウは、JMP データ テーブルに保持する列を選択します
このダブル X ボタンは、すべての列の選択を削除します。単一の X をクリックして、選択した列だけを削除することをお勧めします。 列を説明する行を上下に移動して列を並べ替え、列を選択してデータを事前に並べ替えます。
クエリの実行を選択し、テーブルを調べて、再考します…
上のダイアログから、[テーブル] の横にある赤い三角形をクリックすると、[別のテーブルを追加] ダイアログ (すばらしいもの) に戻ります。 何が起こっているのかを本当に理解するには、別の表が必要でした。
Added another table, recgroupAdded another table, recgroupAdded another table, recgroupAdded another table, recgroup別のテーブル、recgroup を追加しました
recgroups テーブルには、削除されたグループ インジケーターがあります。 結果の一部を次に示します (上部の元の表と同様です)。これらのベース名はすべて、削除されたグループではなく、既定のグループにあります。
The filesize column suggests there is a lot of space I might recoverThe filesize column suggests there is a lot of space I might recoverThe filesize column suggests there is a lot of space I might recoverThe filesize column suggests there is a lot of space I might recoverファイルサイズ列は、回復できるスペースがたくさんあることを示しています
あまりにも多くのスペースが失われました!
表のソース スクリプトの JSL/SQL を次に示します。 <<
New SQL Query(
Connection( "ODBC:DSN=mythtv;SERVER=192.168.0.39;UID=mythtv;DATABASE=mythconverg;PORT=3306;PWD=%_PWD_%;"
),
QueryName( "recorded" ),
Select(
Column( "callsign", "t3" ),
Column( "channum", "t3" ),
Column( "starttime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "endtime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "title", "t1" ),
Column( "description", "t1" ),
Column( "autoexpire", "t1" ),
Column( "preserve", "t1" ),
Column( "deletepending", "t1" ),
Column( "recgroup", "t4" ),
Column( "basename", "t2" ),
Column( "filesize", "t2" ),
Column( "width", "t2" ),
Column( "height", "t2" ),
Column( "fps", "t2" ),
Column( "videoprop", "t5" ),
Column( "subtitletypes", "t5" )
),
From(
Table( "recorded", Alias( "t1" ) ),
Table( "recgroups", Alias( "t4" ),
Join( Type( Left Outer ),
EQ( Column( "recgroupid", "t1" ), Column( "recgroupid", "t4" ) )
)
),
Table( "recordedprogram", Alias( "t5" ),
Join(
Type( Left Outer ),
EQ( Column( "chanid", "t1" ), Column( "chanid", "t5" ) ) &
EQ(
Column("starttime","t1",Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column("starttime","t5",Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) )
)
)
),
Table( "recordedfile", Alias( "t2" ),
Join( Type( Left Outer ),
EQ( Column( "recordedid", "t1" ), Column( "recordedid", "t2" ) )
)
),
Table( "channel", Alias( "t3" ),
Join( Type( Left Outer ),
EQ( Column( "chanid", "t1" ), Column( "chanid", "t3" ) )
)
)
),
Order By( Column( "starttime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ),
Order( "Ascending" ) )
)
) << Run;
したがって、小さなテストを行う必要があります。単一のスタック ファイルの場合は、データベースにアクセスして autoexpire をオンに戻し、deletepending をオフにします。 そして、おそらくバックエンドを停止して再起動します。 次に、数時間または数日後にファイルが削除されるかどうかを監視します... MythTV の動作の一部であるジャストインタイムの削除も混乱を招きます。
Hうーん。 ゆっくりしたほうがいい。 合計ファイルサイズデータベースではの2倍の大きさディスク。これを削除しましょう: 1171_20180321043700.ts
まず、それを見つけるためのクエリを作成します。フィルターを使用しています。 JMP はほとんどの作業を GUI で行うことができ、助けなしに SQL を書くことに完全には慣れていないため、私はこの方法を採用しています。 JMP が面倒な部分をやってくれた後、SQL を修正します。
Add a filter to select a single basename (file)Add a filter to select a single basename (file)Add a filter to select a single basename (file)Add a filter to select a single basename (file)単一のベース名 (ファイル) を選択するフィルターを追加します
良い! フィルタによって WHERE 句が SQL に追加され、正確に 1 つの行が見つかりました。 からSQLをコピーする時が来たと思いますクエリビルダーダイアログ; mythconverg を追加する必要があります。各テーブル名の前:
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
//https://community.jmp.com/t5/Discussions/How-do-I-get-the-list-of-the-databases-available-on-a-designated/m-p/10589
// dtConfig:UserName,Password,DatabaseName
//
// DSN=Mythtv comes from the windows ODBC Data Source Administrator applet
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
SELECT t3.callsign, t3.channum, t1.starttime, t1.endtime,
t1.title, t1.description, t1.autoexpire, t1.preserve,
t1.deletepending, t4.recgroup, t2.basename, t2.filesize,
t2.width, t2.height, t2.fps, t5.videoprop,
t5.subtitletypes
FROM mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
WHERE ( ( ( t2.basename="1171_20180321043700.ts" ) ) )
ORDER BY t1.starttime ASC;
]\","one row");
Close Database Connection(dbc);
close(dtConfig,nosave);
show(nrows(rc)==1); // better only be one row
警告、危険なコードが続きます。UPDATE と SET でデータベースを消去する可能性があります。
そしてSELECTを置き換えます...からとUPDATE して SET 句を追加し、ORDER BY を削除します。
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
UPDATE mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
SET t1.autoexpire=1, t1.deletepending=0
WHERE ( ( ( t2.basename="1171_20180321043700.ts" ) ) );
]\","update");
Close Database Connection(dbc);
close(dtConfig,nosave);
テーブルを再度フェッチすると、更新が表示されます。
The UPDATE and SET workedThe UPDATE and SET workedThe UPDATE and SET workedThe UPDATE and SET workedUPDATEとSETが機能しました
更新のステータスを取得する方法がわかりません。 rc は欠損値であり、テーブルは作成されませんでした。これは理にかなっています。 しかし、それはうまくいきました…
数分後、ファイルはまだ存在しています。 バックエンドを再起動します。 再起動しました。 ファイルがフロントエンドに表示されるようになりました。
Part of the frontend GUI shows the ancient file is visible againPart of the frontend GUI shows the ancient file is visible againPart of the frontend GUI shows the ancient file is visible againPart of the frontend GUI shows the ancient file is visible againフロントエンド GUI の一部で、古代のファイルが再び表示されることが示される
数日後にディスク上で消えるかどうかを確認します。 次に、このような残りのものに取り組み、データベースが 3T ディスクに 6T があると考えているように見える理由を確認します...
数時間後: ls: '1171_20180321043700.ts' にアクセスできません: そのようなファイルまたはディレクトリはありません
上記のように (正規化されたコメント)、ファイル名は複数のテーブルに表示されます。 6T をより現実的な 3T にクリーンアップするという私の計画は、記録されたテーブルに、ディスク上に存在しないファイルを参照するエントリがあることを前提としています。 両方の (おそらくそれ以上の) テーブルからレコードを削除しようとするのではなく、ダミー ファイルがない場合はダミー ファイルを作成し、既存のコードで通常の方法でそれを処理できるようにします。 おそらく最初のステップとして、記録されたデータベース テーブルと記録されたファイル データベース テーブルの両方を JMP データ テーブルに開き、ディスク上で欠落しているファイルやテーブル間で一貫性のないファイルがある場所を特定することをお勧めします。
ファイル→データベース→OpenTable でできます。 basename とrecordedid を除くすべての列を削除し、recordedid でソートし、データテーブルを比較します。 クリックする 3 つの差分。 簡単。
興味深い: 1171_20180317233200.ts は記録されていますが、記録されていませんファイル
0バイトのファイルとして存在する-rw-rw-r-- 1 mythtv mythtv 2018 年 4 月 4 日 1171_20180317233200.ts
また、recordedfile には名前がすべて空白の 2 つのエントリがあり、recorded には一致するrecordedid がありません。 おそらく、他のテーブルがそれらを参照する可能性があることを知らずに、それらをクリーンアップしたくないでしょう。
上記で削除したファイル、 1171_20180321043700.ts 、どちらの表にも表示されません。 わーい!
空白のレコードがないため、recorded を真実として使用します。 fileexists() 関数で列式を使用して、何が起こっているかを確認します。
Graph; points at top represent real files on disk, points at bottom are files that are not on diskGraph; points at top represent real files on disk, points at bottom are files that are not on diskGraph; points at top represent real files on disk, points at bottom are files that are not on diskGraph; points at top represent real files on disk, points at bottom are files that are not on diskグラフ;上の点はディスク上の実際のファイルを表し、下の点はディスク上にないファイルを表します
多くのディスク容量を取り戻す可能性はいくらかありますが、削除したいクラスターには、長さがゼロまたはゼロに近いファイルがたくさんある可能性があります。 休憩の時間です。これを午後 9 時に開始してはいけません。
「いくら?」に答えるには質問ですが、fileexists() ではなく filesize() を使用してください。 多くのファイルが存在しますが、0 バイトであるため、回復可能なスペースは約 0.3T (10% !) しかありません。
フェーズ 1: MythTV が後でそれらをクリーンアップできるように、存在しないファイルのダミー ファイルを追加します。 MythTV がファイルを見つけられない場合にレコードがデータベースに残る理由は、MythTV がファイルが使用できないディスク上にある可能性があり、データベース エントリが削除されると孤立する可能性があると想定するためです。
// actualsize is this formula:
// File Size( "f:/closet/" || :basename )
For Each Row(
If( :basename != "" & Is Missing( actualsize ),
If( !File Exists( "f:/closet/" || :basename ),
Show( :basename );
Save Text File( "f:/closet/" || :basename, "hi there" );// use “touch” on Linux
, // else
Throw( "oops" )
)
)
);
Write( "\!ndone" );
フェーズ 2: データベースの新しいコピーをデータテーブルにフェッチします。 よさそうです。 SQL を作り直して、更新するレコードだけを選択できるかどうかを確認します。
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
SELECT t3.callsign, t3.channum, t1.starttime, t1.endtime,
t1.title, t1.description, t1.autoexpire, t1.preserve,
t1.deletepending, t4.recgroup, t2.basename, t2.filesize,
t2.width, t2.height, t2.fps, t5.videoprop,
t5.subtitletypes
FROM mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
WHERE ( ( ( t1.deletepending=1 ) ) )
ORDER BY t1.starttime ASC;
]\","one row");
Close Database Connection(dbc);
close(dtConfig,nosave);
show(nrows(rc)==1);
これにより、deletepending でハングしているかなり古いレコードの約半分が選択されます。 大胆になる時が来ました…
フェーズ 3: 実行します。
警告、危険なコードが続きます。UPDATE と SET でデータベースを消去する可能性があります。
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
UPDATE mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
SET t1.autoexpire=1, t1.deletepending=0
WHERE ( ( ( t1.deletepending=1 ) ) );
]\","update");
Close Database Connection(dbc);
close(dtConfig,nosave);
deletependings は保留中でなくなり、autoexpire が再び有効になります。 待って見る時間。
翌朝:うまくいっていると思います。より良いメモを作成する必要がありました。 以下は、朝のニュース番組が録画される前 (月曜日の午前 6 時 50 分) に残っている最も古いファイルです。
-rw-r--r-- 1 mythtv mythtv 1.9G 2018 年 3 月 22 日 1111_20180322080000.ts
-rw-r--r-- 1 mythtv mythtv 3.2G 2018 年 3 月 22 日 1051_20180322080000.ts
-rw-rw-rw- 1 mythtv mythtv 1.1M 2018 年 3 月 22 日 1111_20180322043700.ts.png
-rw-r--r-- 1 mythtv mythtv 11G 2018 年 3 月 22 日 1171_20180322060700.ts
-rw-r--r-- 1 mythtv mythtv 5.6G 2018 年 3 月 22 日 1111_20180322063000.ts
-rw-rw-rw- 1 mythtv mythtv 1.4M 2018 年 3 月 22 日 1051_20180322033500.ts.png
-rw-r--r-- 1 mythtv mythtv 3.2G 2018 年 3 月 22 日 1051_20180322070000.ts
-rw-r--r-- 1 mythtv mythtv 5.7G 2018 年 3 月 22 日 1051_20180322060700.ts
-rw-r--r-- 1 mythtv mythtv 3.2G 2018 年 3 月 22 日 1051_20180322053700.ts
-rw-r--r-- 1 mythtv mythtv 1.6G 2018 年 3 月 22 日 1111_20180322053700.ts
-rw-r--r-- 1 mythtv mythtv 6.4G 2018 年 3 月 22 日 1051_20180322043700.ts
-rw-r--r-- 1 mythtv mythtv 5.4G 2018 年 3 月 22 日 1171_20180322043700.ts
-rw-rw-rw- 1 mythtv mythtv 1.4M 2018 年 3 月 22 日 1171_20180322030000.ts.png
-rw-rw-rw- 1 mythtv mythtv 3.4M 2018 年 3 月 22 日 1051_20180322030100.ts.png
-rw-r--r-- 1 mythtv mythtv 2.1G 2018 年 3 月 22 日 1111_20180322043700.ts
-rw-rw-rw- 1 mythtv mythtv 511K 2018 年 3 月 22 日 1111_20180322030000.ts.png
-rw-r--r-- 1 mythtv mythtv 6.6G 2018 年 3 月 22 日 1051_20180322033500.ts
-rw-r--r-- 1 mythtv mythtv 3.8G 2018 年 3 月 22 日 1111_20180322033500.ts
-rw-r--r-- 1 mythtv mythtv 3.3G 2018 年 3 月 21 日 1171_20180322030000.ts
-rw-r--r-- 1 mythtv mythtv 3.7G 2018 年 3 月 21 日 1051_20180322030100.ts
-rw-r--r-- 1 mythtv mythtv 2.4G 2018 年 3 月 21 日 1111_20180322030000.ts
-rw-r--r-- 1 mythtv mythtv 3.3G 2018 年 3 月 21 日 1051_20180321233000.ts
-rw-rw-rw- 1 mythtv mythtv 725K 2018 年 3 月 21 日 1111_20180321200000.ts.png
-rw-rw-rw- 1 mythtv mythtv 2.6M 2018 年 3 月 21 日 1051_20180321200000.ts.png
-rw-r--r-- 1 mythtv mythtv 2.9G 2018 年 3 月 21 日 1051_20180321200000.ts
-rw-r--r-- 1 mythtv mythtv 1.8G 2018 年 3 月 21 日 1111_20180321200000.ts
-rw-rw-rw- 1 mythtv mythtv 897K 2018 年 3 月 21 日 1111_20180321163000.ts.png
-rw-r--r-- 1 mythtv mythtv 3.2G 2018 年 3 月 21 日 1051_20180321163000.ts
-rw-r--r-- 1 mythtv mythtv 2.0G 2018 年 3 月 21 日 1111_20180321163000.ts
-rw-r--r-- 1 mythtv mythtv 2.0G 2018 年 3 月 21 日 1111_20180321160000.ts
-rw-r--r-- 1 mythtv mythtv 102M 2018 年 3 月 21 日 1171_20180321160000.ts
-rw-r--r-- 1 mythtv mythtv 26G 2018 年 3 月 21 日 1051_20180321110000.ts
-rw-r--r-- 1 mythtv mythtv 8.1G 2018 年 3 月 21 日 1111_20180321110000.ts
-rw-r--r-- 1 mythtv mythtv 3.3G 2018 年 3 月 21 日 1171_20180321100000.ts
-rw-r--r-- 1 mythtv mythtv 6.2G 2018 年 3 月 21 日 1051_20180321100000.ts
-rw-r--r-- 1 mythtv mythtv 3.9G 2018 年 3 月 21 日 1111_20180321100000.ts
-rw-rw-rw- 1 mythtv mythtv 743K 2018 年 3 月 20 日 1281_20180321010000.ts.png
-rw-rw-rw- 1 mythtv mythtv 867K 2018 年 3 月 20 日 1281_20180321002000.ts.png
drwxr-xr-x 12 ルート ルート 4.0K 2018 年 3 月 20 日 ..
drwx------ 2 ルート root 16K 2018 年 2 月 28 日 lost+found
Programs recorded Friday will be recorded again today (Monday)Programs recorded Friday will be recorded again today (Monday)Programs recorded Friday will be recorded again today (Monday)Programs recorded Friday will be recorded again today (Monday)金曜日に録画された番組は、今日(月曜日)に再び録画されます
これら 3 つのプログラムは、先週の金曜日に約 40 GB を使用しました。 9:30 に、記録されたテーブルの最後の 13.4G が削除されました。 他の 15G がどこから来たのかはわかりません。 おそらく、削除キューにはすでにいくつかのファイルがありました。 たぶん、これらは古いものから順に追加されたもので、他のいくつかの後に追加されたのかもしれません...私は日中のテレビを録画しないようにしているので、削除されたファイルがさらに表示されるのは今夜になるかもしれません. (はい、それは起こっています!) png (巨大な) サムネイルも自分自身の面倒を見ることを願っています。
JMP と SQL について学んだこと: 結合が必要ない場合 ([ファイル] → [データベース] → [テーブルを開く])、SQL テーブルを JMP データ テーブルにロードする非常に簡単な方法があります。結合されます(ファイル→データベース→クエリビルダー。)これらは両方とも、再利用できるテーブルにJSLスクリプトを生成します。 また、データベースを更新する必要がある場合は、ExecueSQL() 関数を使用する必要がありますが、Query Builder を使用してほぼ必要な SQL を作成し、それを変更して UPDATE/SET を実行できます。
過去に、JMP 以外で SQL 作業を行ったことがあります。 JSL を使用して SQL 以外の作業 (ダミー ファイルの作成、ディスク使用量のグラフの作成) を行うと、データベースをよりよく理解するのに役立ちます。
https://code.mythtv.org/cgit/mythtv/tree/mythtv/programs/mythbackend/autoexpire.cpp古いファイルのクリーンアップに関連する MythTV ソース コードの出発点
https://en.wikipedia.org/wiki/コードカット
すべてが正常に戻ったようです。 この最後のグラフは、さまざまなステーションが利用可能な帯域幅をどのように最適化したかを示しています。 帯域幅は 1 つまたは複数のチャネルに分割できます。より多くのチャンネルが減少するということは、高品質の画像を作成するためのデータが少なくなることを意味します。 ローカル ステーションの 1 つも 1080 30 FPS ではなく 720 60 FPS を使用することを選択しました。 強調表示された各チャネルには、帯域幅を共有している同じステーションからの 1 つ以上の他のチャネルが含まれている可能性があります。 下部にある灰色のステーションは、同時に複数の古い映画やショッピング チャンネルを放送している可能性があります。 それらは伝説から削除されました。
Lines with bigger slope have more bandwidth allocated to the pictureLines with bigger slope have more bandwidth allocated to the pictureLines with bigger slope have more bandwidth allocated to the pictureLines with bigger slope have more bandwidth allocated to the picture傾きが大きい線ほど、画像に割り当てられる帯域幅が大きくなります。