84 lines
2.7 KiB
Bash
Executable File
84 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
# usage: get_query_profiles.sh -q query_id -o output_dir
|
|
|
|
FE_HOST="127.0.0.1"
|
|
FE_QUERY_PORT=9939
|
|
USER=root
|
|
PASSWORD=""
|
|
QUERY_ID=""
|
|
OUTPUT_DIR=""
|
|
|
|
SHOW_QUERY_PROFILE="show query profile"
|
|
MYSQL_CMD_ARGS=(-h"${FE_HOST}" -u"${USER}" -P"${FE_QUERY_PORT}")
|
|
if [[ -n "${PASSWORD}" ]]; then
|
|
MYSQL_CMD_ARGS+=(-p"${PASSWORD}")
|
|
fi
|
|
|
|
while getopts ":q:o:" opt; do
|
|
case "${opt}" in
|
|
q)
|
|
QUERY_ID="${OPTARG}"
|
|
;;
|
|
o)
|
|
OUTPUT_DIR="${OPTARG}"
|
|
;;
|
|
*) ;;
|
|
|
|
esac
|
|
done
|
|
|
|
if [[ -z "${QUERY_ID}" ]]; then
|
|
# QUERY_ID=$(mysql -h$FE_HOST -u$USER -P$FE_QUERY_PORT -e"show query profile '/'" | cut -f 1 | sed -n '3p')
|
|
echo "no query id"
|
|
exit
|
|
fi
|
|
if [[ -z "${OUTPUT_DIR}" ]]; then
|
|
echo "no output dir"
|
|
exit
|
|
fi
|
|
|
|
echo "get profiles for query ${QUERY_ID}, output dir: ${OUTPUT_DIR}"
|
|
|
|
mkdir -p "${OUTPUT_DIR}"
|
|
|
|
PLAN_GRAPH_FILE=${OUTPUT_DIR}/${QUERY_ID}_plan_graph
|
|
FRAGS_FILE=${OUTPUT_DIR}/${QUERY_ID}_frags
|
|
FRAG_IDS_FILE=${OUTPUT_DIR}/${QUERY_ID}_frag_ids
|
|
|
|
mysql "${MYSQL_CMD_ARGS[@]}" -e "${SHOW_QUERY_PROFILE} '/${QUERY_ID}'" | sed 's/\\n/\n/g' >"${PLAN_GRAPH_FILE}"
|
|
|
|
grep "Fragment: " "${PLAN_GRAPH_FILE}" | sort | uniq >"${FRAGS_FILE}"
|
|
sed 's/Fragment: \{1,\}\([0-9]\{1,\}\)/\n\1\n/g' "${PLAN_GRAPH_FILE}" | grep -E "^[0-9]{1,}$" | sort | uniq >"${FRAG_IDS_FILE}"
|
|
|
|
# frag inst ids
|
|
while read -r frag_id; do
|
|
sql="${SHOW_QUERY_PROFILE} '/${QUERY_ID}/${frag_id}'"
|
|
frag_inst_ids_outfile="${OUTPUT_DIR}/frag_${frag_id}_instances"
|
|
|
|
echo "sql: ${sql}"
|
|
mysql "${MYSQL_CMD_ARGS[@]}" -e "${sql}" | sed -n '2,$p' >"${frag_inst_ids_outfile}"
|
|
while read -r line; do
|
|
frag_inst_id=$(echo "${line}" | cut -f1)
|
|
frag_inst_profile="${OUTPUT_DIR}/frag_${frag_id}_${frag_inst_id}"
|
|
sql="${SHOW_QUERY_PROFILE} '/${QUERY_ID}/${frag_id}/${frag_inst_id}'"
|
|
mysql "${MYSQL_CMD_ARGS[@]}" -e "${sql}" | sed 's/\\n/\n/g' >"${frag_inst_profile}"
|
|
done <"${frag_inst_ids_outfile}"
|
|
done <"${FRAG_IDS_FILE}"
|